正则表达式匹配末尾短语求助:独立捕获可选'on court 1'
解决正则捕获组匹配错位问题
我明白你的问题了——当前正则里的venue捕获组因为用了贪婪的.*,会把末尾的on court 1也一起吞掉,而你希望venue只匹配at New Albany High School,把on court 1留给location组。
问题根源
原正则中(?<venue>.*)?的.*是贪婪匹配,它会尽可能匹配所有剩余字符,哪怕后面还有可选的location捕获组,正则引擎也会优先把内容全部分配给venue,导致location组无法捕获到目标内容。
修改后的正则
我们可以给venue的匹配加上边界限制,让它在遇到on 或者字符串结尾时停止,这样就能把后续的on court 1留给location组:
^(?<minimum>\d*)(?<dash>-)?(\sor\s(?<moreless>more|less)\s?)?(?<maximum>\d*)((?:on\s|\s)+(?<date>[^\s]*)?)?((?:at\s|\s){1}(?<venue>.*?(?=\son\s|$))?)?((?:on\s|\s){1}(?<location>.*)?)?
关键调整点
把原正则中venue部分的(?<venue>.*)?改成了(?<venue>.*?(?=\son\s|$))?:
.*?:非贪婪匹配,尽可能少的匹配字符(?=\son\s|$):正向预查,匹配到on(前面带空格)或者字符串结尾时停止,确保venue不会包含后续的location前缀内容
测试验证
比如输入字符串at New Albany High School on court 1:
venue组会捕获到New Albany High Schoollocation组会捕获到court 1
如果输入没有on court 1,比如at New Albany High School,venue组也能正常捕获完整的场地内容,location组为空,符合预期。
内容的提问来源于stack exchange,提问作者Mike Flynn
相关产品推荐
相关产品推荐

