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

时间:2019-05-17 10:43:18

标签: regex regex-lookarounds regex-greedy

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

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

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

  

Trittbergets Ronja

     

Minitiger的 Samanta Junior

     

Björntorpets Cita

     

Sors Kelly的 Majsskalle

问题在于,Kelly's Majsskalle只能选择Majsskalle时返回。

这里是 regex101 的链接,用于调试: https://regex101.com/r/PZWxr7/1

我如何提前忽略第一场比赛?

3 个答案:

答案 0 :(得分:3)

您需要强制使用正则表达式引擎来使用点星号找到最后一个匹配项:

^.*s\s(.*)$

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

请参见live demo here

或使用回火点:

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

请参见live demo here

注意:前者是更好的解决方案。

答案 1 :(得分:2)

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

将您在regex101上的模式更新为此,您将看到区别:

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

编辑-我不好,我没有发现最后一行。

您还可以提前否定,以确保在下一场比赛中没有其他单词以s结尾:

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

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

答案 2 :(得分:1)

无需提前。只需尝试:

.*s\s(.*?)$