鉴于字符串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)
非常感谢任何帮助
答案 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(区分大小写)
.
匹配任何字符(换行符除外)