如何用正则表达式提取目标模式最后一次出现后的所有内容?
问题描述
现有字符串列表:
This is [xxxx] a string [yyyy] and this is more of it.This is [yyyy]\nalso a string [xxxx] and this is more of it.
需求是按[xxxx]和[yyyy]标记分割字符串,目前已实现:
- 提取标记前的文本:
^.*?(?=\[(xxxx|yyyy)\]) - 提取两个标记之间的文本:
(?<=\[(xxxx|yyyy)\]).*?(?=\[(xxxx|yyyy)\])
但无法提取最后一次标记出现后的末尾文本:
- 使用
(?<=\[(xxxx|yyyy)\]).*会提取第一个标记后的所有内容,而非最后一个标记之后的部分 - 使用字符排除类(如
[^xy\[\]]*$)不可行,因为会误匹配字符串中作为单词组成部分的x/y字符
解决方案
方法1:正则直接匹配
使用带负向预查的正则表达式,精准匹配最后一个标记之后的内容:
(?<=\[(xxxx|yyyy)\])(?!.*\[(xxxx|yyyy)\]).*
表达式解释:
(?<=\[(xxxx|yyyy)\]):正向断言,定位到[xxxx]或[yyyy]结束后的位置(?!.*\[(xxxx|yyyy)\]):负向预查,确保当前位置之后不再存在任何目标标记.*:匹配从该位置到字符串结尾的所有内容
方法2:先定位最后一个标记再截取
如果正则逻辑不好理解,也可以通过定位标记位置来截取:
- 用正则
\[(xxxx|yyyy)\](?!.*\[(xxxx|yyyy)\])匹配最后一个目标标记 - 获取该标记在字符串中的结束索引
- 从结束索引的下一位开始,截取到字符串末尾
测试示例
对第一个字符串This is [xxxx] a string [yyyy] and this is more of it.,提取结果为: and this is more of it.
对第二个字符串This is [yyyy]\nalso a string [xxxx] and this is more of it.,提取结果为: and this is more of it.
内容的提问来源于stack exchange,提问作者Jigsaw
相关产品推荐
相关产品推荐

