正则提取静态词后内容:匹配逗号或字符串结尾的问题
正则提取静态词后内容:指定逗号或字符串结尾为终止条件
场景说明
待处理字符串的顺序和数量会变化,但一定会出现Bob和Mike这两个名称,举几个例子:
- "Bob: 44-51mL/kg/min, Mike: (Bodyweight)1.5 minutes"
- "Mike: (Bodyweight)1.5 minutes"
- "Mike: (Bodyweight)1.5 minutes, Bob: 44-51mL/kg/min"
现有问题
我之前用的正则是:
\Mike:?(\s.*?)?(,)|$
本来想以Mike为起点(冒号可选),提取到逗号或者字符串结尾,但现在只有字符串里有逗号时能生效,没逗号就提不出结果。
解决办法
问题出在正则的终止条件逻辑上,调整后的正则可以直接解决这个问题:
Mike:?\s*(.*?)(?=,|$)
简单解释下各部分作用:
Mike:?:匹配固定名称Mike,后面的冒号可选(满足有时没有冒号的情况)\s*:匹配0个或多个空格,处理冒号后可能有空格的情况(.*?):非贪婪模式匹配任意字符,专门用来捕获我们需要的内容(?=,|$):正向预查,意思是匹配到逗号或者字符串结尾就停止,而且不会把逗号包含到提取结果里
如果需要同时提取Bob和Mike的内容,也可以把名称改成可选分组:
(Bob|Mike):?\s*(.*?)(?=,|$)
这样不管目标名称后面有没有逗号,都能正确提取到对应的内容。
内容的提问来源于stack exchange,提问作者reide
相关产品推荐
相关产品推荐

