正则表达式在一行上匹配彼此靠近的两个单词

时间:2014-09-19 10:00:10

标签: regex pcre

您好我正在尝试构建一个正则表达式(PCRE),它能够在彼此附近找到两个单词,但它们出现在同一行上。通常提供的近示例不足以满足我的要求,因为“\ W”显然包括新行。我花了很多时间试图找到答案,但到目前为止还没有成功。为了举例说明我目前的情况,请参阅以下内容:

(?i)(?:\b(tree)\b)\W+(?:\w+\W+){0,5}?\b(house)\b.*

我想要匹配:

here is a tree with a house

但不匹配

here is a tree 
with a house

非常感谢任何帮助!

6 个答案:

答案 0 :(得分:0)

怎么样

\btree\b[^\n]+\bhouse\b

答案 1 :(得分:0)

只需添加一个否定的预测即可匹配所有非单词字符,但不能添加新行字符。

(?i)(?:\b(tree)\b)(?:(?!\n)\W)+(?:\w+\W+){0,5}?\b(house)\b.*

DEMO

答案 2 :(得分:0)

Dot匹配除换行符之外的任何内容,所以只需:

(?i)\btree\b.{1,5}\bhouse\b

请注意,两个单词之间不可能有零个字符,因为它们不会是两个单词 - 它们将是一个单词而\b不会匹配。

答案 3 :(得分:0)

在正则表达式中将\W替换为[^\w\r\n]

(?i)(?:\b(tree)\b)[^\w\r\n]+(?:\w+[^\w\r\n]+){0,5}?\b(house)\b.*

答案 4 :(得分:0)

要在同一行中获得两个单词的最接近匹配,选项是使用否定lookahead

(?i)(\btree\b)(?>(?!(?1)).)*?\bhouse\b
  • .点默认值与换行符不匹配(仅限s DOTALL修饰符)
  • (?>(?!(?1)).)*?尽可能少的任何字符,\btree\b
  • (?1)粘贴第一个带括号的模式。

Example at regex101.com; Regex FAQ

答案 5 :(得分:0)

也许有帮助,在https://www.regular-expressions.info/near.html

\bword1\W+(?:\w+\W+){1,6}?word2\b.