我对正则表达式有很好的了解,但这是我遇到的一件事。
我有这个字符串:
foo xxx bar z
我只想在foo AND bar上匹配整个字符串,而不管顺序如何。
到目前为止,我已经掌握了这个,但是我需要捕获整个字符串:
(?=foo|bar)[^\s]+
答案 0 :(得分:2)
您需要的是这样的
(.*foo.+bar.*)|(.*bar.+foo.*)
演示:https://regex101.com/r/3SQhg2/1
编辑:我错过了foo
和bar
必须作为一个整体出现的观点。解决方法如下:
对于订单foo-> bar
^.*\bfoo\b.*bar\b.*$
对于命令栏-> foo(只需在上一个中交换foo
和bar
)
^.*\bbar\b.*foo\b.*$
两者结合:
^.*\bfoo\b.*bar\b.*$|^.*\bbar\b.*foo\b.*$
答案 1 :(得分:1)
我想通了,我想删除它,但是也许其他人也会有这个问题,所以我也将答案发布在这里。
^
( # let's start capturing
.* # if there's something before the two words
(?:
(?=\bfoo\b)\w+ # match the first word
.* # if there's something in the middle of the two words
(?=\bbar\b)\w+ # match the second word
| # OR let's do everything above but in reverse this time
(?=\bbar\b)\w+
.*
(?=\bfoo\b)\w+
)
.* # if there's something after the two words
)
$
匹配+捕获的内容
foo xxx bar z
和
yy bar z foo xxx
但不是
aa foobb bar
和
xx bar xfoo
答案 2 :(得分:1)
尝试此正则表达式:
^(?=.*\bfoo\b)(?=.*\bbar\b)(.*)$
说明:
^
-断言行的开头(?=.*\bfoo\b)
-正向查找,以确保当前行包含由单词边界包围的单词foo
。(?=.*\bbar\b)
-正向查找,以确保当前行包含由单词边界包围的单词bar
。(.*)
-匹配并捕获除换行符之外的任何字符的0+次出现。$
-声明该行的结尾。