我正在尝试从字符串中提取名称的一部分。我几乎拥有它,但是在使用正向前瞻的地方有些不对劲。
这是我的正则表达式:(?=s\s(.*?)$)
我已用粗体文本标记了我想要的所有结果。
Trittbergets Ronja
Minitiger的 Samanta Junior
Björntorpets Cita
Sors Kelly的 Majsskalle
问题在于,Kelly's Majsskalle
只能选择Majsskalle
时返回。
这里是 regex101 的链接,用于调试: https://regex101.com/r/PZWxr7/1
我如何提前忽略第一场比赛?
答案 0 :(得分:3)
您需要强制使用正则表达式引擎来使用点星号找到最后一个匹配项:
^.*s\s(.*)$
.*
会立即消耗掉所有内容直到一个换行符,然后引擎回溯以匹配下一个模式。
或使用回火点:
s(?= ((?:(?!s ).)+)$)
^^^^^^^^^^
Match a byte only if we are not pointing at a `s[ ]`
注意:前者是更好的解决方案。
答案 1 :(得分:2)
前瞻应用于确定捕获的开始或捕获的结束。要在第一次捕获后 开始捕获,您需要使用后向搜索-这样可以确保捕获之前的文本是该搜索模式。
将您在regex101上的模式更新为此,您将看到区别:
(?<=s\s).*?$
编辑-我不好,我没有发现最后一行。
您还可以提前否定,以确保在下一场比赛中没有其他单词以s
结尾:
(?<=s\s)(?!.+?s\s).*?$
这解决了最后一行的问题。
答案 2 :(得分:1)
无需提前。只需尝试:
.*s\s(.*?)$