条件正则表达式构建:匹配不同格式字符串中的目标内容
解决方案
针对捕获不带括号的核心描述(如Age场景)
你之前的两个正则组合失效,是因为正则的贪婪模式和匹配优先级问题。直接用|拼接时,第一个正则.+(?= \(?.+\)?)会贪婪匹配到几乎整个字符串,第二个正则根本没机会生效。
可以用单一正向预查覆盖两种场景,正则如下:
^(.+?)(?= (?:\(.+\) )?\d+\.\d+$)
解释:
^:从字符串起始位置匹配,避免中间匹配干扰(.+?):非贪婪捕获目标内容,确保不会过度匹配(?= ...):正向预查,限定后面必须是两种结尾之一:(?:\(.+\) )?:可选的“(任意文本) ”结构(非捕获组,不纳入结果)\d+\.\d+$:字符串结尾的小数格式(如0.0、1.0)
这个正则能同时适配你的两个Age场景:
- 输入
'Age at death (years) 0.0'→ 捕获Age at death - 输入
'Age at death 0.0'→ 捕获Age at death
针对捕获包含第一个括号的内容(如Weight/BMI场景)
如果需要保留第一个闭合括号内的内容,排除后续文本和结尾小数,用这个正则:
^(.+?\))(?= .*\d+\.\d+$)
解释:
(.+?\)):非贪婪捕获到第一个)为止,确保只保留第一个括号及其前面的内容(?= .*\d+\.\d+$):预查后面存在任意文本+结尾小数,确保匹配的是目标部分
适配示例:
- 输入
'Weight (pre-imaging) (Kg) 1.0'→ 捕获Weight (pre-imaging) - 输入
'Body mass index (BMI) more text to be captured (Kg/m2) 0.0'→ 捕获Body mass index (BMI)
如果需要区分两种场景自动匹配
如果你的字符串同时存在两种类型(有的要排除括号,有的要保留第一个括号),可以用分支结构结合位置限定,让正则优先匹配需要保留括号的场景,再匹配排除括号的场景:
^(.+?\))(?= .*\d+\.\d+$)|^(.+?)(?= (?:\(.+\) )?\d+\.\d+$)
使用时取第一个非空的捕获组即可(第一种场景匹配到组1,第二种场景匹配到组2)。
内容的提问来源于stack exchange,提问作者random
相关产品推荐
相关产品推荐

