正则表达式在句子中断方面不匹配

时间:2019-04-23 16:11:20

标签: regex

我想在其他词的上下文中匹配某些词,例如,如果我想在谈论三明治时尝试捕获馅料,我可以这样做:

(?:sandwich|toastie).{0,100}(ham|cheese|pickle)

Andy sat down to enjoy his sandwich which, unusally for him, was filled with delicious ham之类的匹配项

但是,这也会跨越“上下文中断”,例如句子结尾标点或换行符,例如Victorians enjoyed a good sandwich after work. They also enjoyed cheese rolling.。在这种情况下,我想在匹配句子时取消匹配。

所以我尝试做(?:sandwich|toastie)(?:\w\. ){0}.{0,100}(ham|cheese|pickle),但这不起作用。我在想像[^\w\. ]之类的东西,但这也不对

2 个答案:

答案 0 :(得分:1)

尝试拒绝示例字符串的方式,您需要使用tempered greedy token而不是编写方式,并且需要这样编写正则表达式,

(?:sandwich|toastie)(?:(?!\w\. ).){0,100}(ham|cheese|pickle)

Regex Demo

因此,基本上,当您尝试否定(?:\w\. )模式以使匹配失败时,您需要编写(?:(?!\w\. ).)而不是.,否则将导致匹配失败以及这些单词中的单词两个括号不会在两个不同的句子中匹配。

答案 1 :(得分:1)

您可以使用带有否定字符类的tempered greedy token来断言右边的内容不是列出的任何单词,点号后跟空格或换行符:

(?:sandwich|toastie)(?:(?!(?:ham|cheese|pickle|\w\. +|(?:\r?\n|\r))).){1,100}(?:ham|cheese|pickle)

说明

  • (?:sandwich|toastie)匹配选项之一
  • (?:非捕获组
    • (?!负向超前以防止过度匹配,因此断言不是
      • (?:ham|cheese|pickle|\w\. |(?:\r?\n|\r))匹配任何选项
    • ).结束负向查找并匹配任何字符
  • ){1,100}关闭非捕获组并重复1-100次
  • (?:ham|cheese|pickle)匹配选项之一

Regex demo

您可能考虑对\b\b(?:sandwich|toastie)\b使用单词边界\b(?:ham|cheese|pickle)\b,以防止单词成为较大单词的一部分。