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

RegEx for enforcing and finding the last match

我正在尝试从字符串中提取名称的一部分。我几乎做到了,但是我使用正向前瞻的地方有些不对。

这是我的正则表达式:(?=s\s(.*?)$)

我已经用粗体文本标记了我想要的所有结果。

Trittbergets Ronja

Minitiger's Samanta Junior

Björntorpets Cita

Sors Kelly's Majsskalle

问题是 Kelly's Majsskalle 被返回,而它应该只返回 select Majsskalle.

这里有一个link到regex101调试用: https://regex101.com/r/PZWxr7/1

如何让前瞻性忽略第一场比赛?

您需要强制执行正则表达式引擎以使用 dot-star:

查找最后一个匹配项
^.*s\s(.*)$

A .* 立即消耗所有内容直至换行符,然后引擎回溯以匹配下一个模式。

live demo here

或使用钢化点:

s(?= ((?:(?!s ).)+)$)
      ^^^^^^^^^^
  Match a byte only if we are not pointing at a `s[ ]`

live demo here

注意:前者为优

前瞻应用于确定捕获的开始或捕获的结束。要在第一次捕获 之后开始捕获,您需要使用后视 - 这可确保捕获之前的文本是该搜索模式。

将您在 regex101 上的模式更新为此,您将看到不同之处:

(?<=s\s).*?$

编辑 - 不好意思,我没看到最后一行。

您还可以包含一个 negative 前瞻以确保在下一个匹配中没有另一个词以 s 结尾:

(?<=s\s)(?!.+?s\s).*?$

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

不需要向前看。试试这个:

.*s\s(.*?)$