我正在尝试从字符串中提取名称的一部分。我几乎拥有它,但是我使用积极的展望的地方有些不对劲。
这是我的正则表达式:(?=ss(.*?)$)
我已经用粗体文本标记了我想要的所有结果。
特里特贝吉特·罗尼亚
迷你虎的萨曼塔少年
比约恩托佩茨城
索尔斯凯利的Majsskalle
问题是Kelly's Majsskalle
被返回,当它应该只选择Majsskalle
.
这是用于调试的regex101的链接: https://regex101.com/r/PZWxr7/1
如何让前瞻忽略第一场比赛?
无需前瞻。试试这个:
.*ss(.*?)$
您需要强制使用正则表达式引擎来查找最后一个匹配项:
^.*ss(.*)$
.*
会立即消耗所有内容,直到换行符,然后引擎回溯以匹配下一个模式。
在此处观看现场演示
或使用回火点:
s(?= ((?:(?!s ).)+)$)
^^^^^^^^^^
Match a byte only if we are not pointing at a `s[ ]`
在此处观看现场演示
注意:前者是更好的解决方案。
前瞻应用于确定捕获的开始或结束。要在第一次捕获后开始捕获,您需要使用回溯 - 这可确保捕获之前的文本是该搜索模式。
将 regex101 上的模式更新为此,您将看到差异:
(?<=ss).*?$
编辑- 我的错,我没有发现最后一行。
您还可以包含负面的前瞻,以确保在下一场比赛中没有另一个以s
结尾的单词:
(?<=ss)(?!.+?ss).*?$
这解决了最后一行的问题。