用于强制执行和查找最后一个匹配项的正则表达式



我正在尝试从字符串中提取名称的一部分。我几乎拥有它,但是我使用积极的展望的地方有些不对劲。

这是我的正则表达式:(?=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).*?$

这解决了最后一行的问题。

最新更新