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中匹配的文本不能与后面有单词边界的文本相同(?!\1\b)
-与组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肯定会的。但这种改变会导致更多的回溯。