正则表达式,匹配未包含的任何内容

时间:2016-08-23 22:56:20

标签: c# regex regex-lookarounds

鉴于字符串foobarbarbarfoobar,我想拥有foo之间的所有内容。所以我使用了这个表达式,结果是:barbarbar。它工作得很好。

(?<=foo).*(?=foo)

现在我也希望相反。所以给定字符串foobarbarbarfoobar我想要foo不包含的所有内容。我尝试了以下正则表达式:

(?<!foo).*(?!foo)

我期望bar作为结果,但它返回foobarbarbarfoobar的匹配。这对我来说没有意义。我错过了什么?

来自https://regex101.com/的解释对我来说很好看?

(?<!foo).*(?!foo)
(?<!foo) Negative Lookbehind - Assert that it is impossible to match the regex below
foo matches the characters foo literally (case sensitive)
.* matches any character (except newline)
Quantifier: * Between zero and unlimited times, as many times as possible,    giving back as needed [greedy]
(?!foo) Negative Lookahead - Assert that it is impossible to match the regex below
foo matches the characters foo literally (case sensitive)

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

我希望有人找到更好的方法,但这种憎恶可能会做你想要的: (.*)foo(?<=foo).*(?=foo)foo(.*)

第一个foo之前的文本位于捕获组1中(使用您提供的示例,这将是空的)并且在捕获组2之后(在这种情况下将是&#39; bar&#39;)

如果您希望两端都包含“foo”,请改用:(.*)(?<=foo).*(?=foo)(.*)。这将导致'foo&#39;在第1组中,&#39; foobar&#39;在第2组中。

答案 1 :(得分:0)

我找到了解决方案:

^((?!foo).)+

regex101的解释

  

^断言字符串开头的位置
  第一个捕获小组 ((?!foo).)+
  量词:+在一次和无限次之间,尽可能多次,根据需要回馈   注意重复捕获组仅捕获最后一次迭代。如果您对数据不感兴趣,请在重复组周围放置捕获组以捕获所有迭代或使用非捕获组
  (?!foo)否定前瞻 - 断言不可能匹配下面的正则表达式   foo字面匹配字符foo(区分大小写)
  .匹配任何字符(换行符除外)