Regex 无论顺序如何,在两个或多个单词之间匹配字符串

Regex 无论顺序如何,在两个或多个单词之间匹配字符串,regex,pcre,Regex,Pcre,我需要一个正则表达式来匹配单词,而不考虑顺序。例如,这些线应与标记的范围相匹配 A longword1 B longword2 C ^-------------------^ A longword2 B longword1 C ^-------------------^ 而这些不应该: A longword1 B longword1 C A longword2 B longword2 C A longword1 B A longword2 C (A、B、C是填充词,基本上可以是任何

我需要一个正则表达式来匹配单词,而不考虑顺序。例如,这些线应与标记的范围相匹配

A longword1 B longword2 C
  ^-------------------^

A longword2 B longword1 C
  ^-------------------^
而这些不应该:

A longword1 B longword1 C
A longword2 B longword2 C
A longword1 B
A longword2 C
(A、B、C是填充词,基本上可以是任何文本)

可以只使用替换,例如:
\b((longword1)。*?(longword2)|(longword2)。*?(longword2))\b
。但是正则表达式会成倍增长,即三个单词需要三个!轮换。也可以使用子程序,例如
\b((?'A'longword1)。*?(?'b'longword2')|(?P>b)。*?(?P>A))\b
。虽然较短,但我仍然需要包括它的所有排列

现在我已经读过了,但是被接受的答案并不能完全解决我的问题。使用
\b(?=.*longword1)(?=.*longword2)。*\b
将匹配整行,而不是我显示的范围

我明白,如果我对照单词列表检查句子会容易得多。但是我当前的用例阻止它成为可能;我只能使用正则表达式

以下是一些链接来说明我的意思:

期望值:

  • 使用备选方案:
  • 使用子程序:
不正确:

  • 使用正向前瞻(链接时):

有没有更简单的正则表达式来解决这个问题?

您可以使用反向引用+子例程:

\b(longword1|longword2)\b.*?\b(?!\1\b)(?1)\b
将其扩展为三种备选方案:

\b(longword1|longword2|longword3)\b.*?\b(?!\1\b)((?1))\b.*?\b(?!(?:\1|\2)\b)(?1)\b
也可以看到和。因此,单词列表将在组1中,您只需要在后续子例程之前添加反向引用

详细信息

  • \b(longword1 | longword2)\b
    -一个完整的单词,或者
    longword1
    或者
    longword2
  • *?
    -除换行符以外的任何0个或更多字符,尽可能少
  • \b
    -单词边界
  • (?!\1\b)
    -组1中匹配的文本不能与后面有单词边界的文本相同
  • (?1)
    -与组1中相同模式匹配的子例程
  • \b
    -单词边界

A
C
放在另一篇文章的解决方案周围。@Barmar我找不到你提到的解决方案。什么意思?
A.*\b(?=.*longword1)(?=.*longword2.*\b.*C
@Barmar,但它从
A
C
匹配。OP只需要匹配从word1到word2的子字符串
A
C
只是填充词,它们表示任何文本。单词1和单词2可以互换。“可能不止两个词,”巴尔马重申@Wiktor Stribiżew的评论,“A和C可以是任何东西。”。它只是一种填充物。看我的博文我只是好奇,这种语法会严重影响正则表达式的性能吗?@NickyLogan肯定会的。但这种改变会导致更多的回溯。