正则表达式匹配包含子集的整个字符串

时间:2019-04-24 02:18:00

标签: regex regex-lookarounds

我对正则表达式有很好的了解,但这是我遇到的一件事。

我有这个字符串:

foo xxx bar   z

我只想在foo AND bar上匹配整个字符串,而不管顺序如何。

到目前为止,我已经掌握了这个,但是我需要捕获整个字符串:

(?=foo|bar)[^\s]+

3 个答案:

答案 0 :(得分:2)

您需要的是这样的

(.*foo.+bar.*)|(.*bar.+foo.*)

演示:https://regex101.com/r/3SQhg2/1


编辑:我错过了foobar必须作为一个整体出现的观点。解决方法如下:

对于订单foo-> bar

^.*\bfoo\b.*bar\b.*$

对于命令栏-> foo(只需在上一个中交换foobar

^.*\bbar\b.*foo\b.*$

两者结合:

^.*\bfoo\b.*bar\b.*$|^.*\bbar\b.*foo\b.*$

演示:https://regex101.com/r/3SQhg2/4

答案 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

https://regex101.com/r/3wzFh3/2

答案 2 :(得分:1)

尝试此正则表达式:

^(?=.*\bfoo\b)(?=.*\bbar\b)(.*)$

Click for Demo

说明:

  • ^-断言行的开头
  • (?=.*\bfoo\b)-正向查找,以确保当前行包含由单词边界包围的单词foo
  • (?=.*\bbar\b)-正向查找,以确保当前行包含由单词边界包围的单词bar
  • (.*)-匹配并捕获除换行符之外的任何字符的0+次出现。
  • $-声明该行的结尾。