可选的前瞻

时间:2018-06-25 10:25:26

标签: regex

我需要从句子中提取一些单词组。句子大致如下:

I want to see Coldplay
I want to see Rise Against in New York

我想提取see之后的所有字符串,但是如果出现单词in,我想停止。

  1. see (?P<band>[\w\s]+)匹配Coldplay但匹配Rise against in New York
  2. see (?P<band>[\w\s]+?)匹配CR
  3. see (?P<band>[\w\s]+?) (?=in)匹配Rise Against,但不匹配其他句子
  4. see (?P<band>[\w\s]+?) (?=in)?不允许
  5. see (?P<band>[\w\s]+?)(?: in)?匹配CR

去这里要走什么路?

3 个答案:

答案 0 :(得分:0)

  

我想提取“ see”之后的所有字符串,但是如果出现“ in”一词,我想停止。

这可能有帮助:

(?P<band>(?<=see)(.(?!in ))*)

https://regex101.com/r/48MZBT/1/

答案 1 :(得分:0)

如果您稍作修改,您的第三个示例可能会返回预期的匹配项:

see (?P<band>.+?)(?= in|$)

这意味着您应该强制执行结束边界匹配。也可以尝试:

see (?P<band>.*?)(?: in\b|$)

或:

see (?P<band>(?:(?! in\b).)*)

前两个正则表达式需要启用m标志。

请参见live demo here

答案 2 :(得分:0)

如果您只想匹配单词字符和空格字符,则可以使用以下内容:

see (?P<band>[\w\s]+?)(?= in|[^\w\s]|$)

Try it online

另一方面,如果不打算使用[\w\s],而您实际上想匹配seein之间的任何内容,则可以参考revo's answer

编辑:

似乎您也不想在比赛中加入see。如果是这样,您可以使用Lookbehind,因此上述模式如下所示:

(?<=see )(?P<band>[\w\s]+?)(?= in|[^\w\s]|$)

Another demo