我怎样才能找到所有内容但是某些短语带有正则表达式?

时间:2010-11-05 18:58:45

标签: regex regex-negation

好的,所以我有一个短语“foo bar”,我想找到一切但是“foo bar”。
这是我的文字。

  

ipsum dolor foo bar Lorem ipsum dolor sit amet,
  consectetur adipisicing elit,sed do   eiusmod tempor foo bar incididunt ut labore et
  dolore foo bar

有一种方法可以在正则表达式中做到这一点吗?我不必去使用字符串等吗?

结果:

注意我不能做一个很好的突出显示,但粗体给你一个想法(虽然前后的空格也会被选中,但它会打破粗体)。

ipsum dolor foo bar Lorem ipsum dolor sit amet,
consectetur adipisicing elit,sed do
eiusmod tempor foo bar incididunt ut labore et
dolore foo bar

假设PCRE命名法。


更新2013年7月29日:最好使用您选择的语言搜索和替换功能,只是“删除”您不想要的短语,这样您就会得到您所做的信息想。

6 个答案:

答案 0 :(得分:9)

一般情况下,如果foobar与自身匹配,则(?s:(?!foobar).)*会匹配 foobar的任何内容,包括任何内容。

您可以使用它来查找其中没有foobar的行,例如,使用

^(?:(?!foobar).)*$

您还可以使用语言的split()功能在 foobar上拆分,这将为您提供所包含的所有内容分裂模式。

关于像(*FAIL)(*COMMIT)那样令人讨厌的鲜为人知的回溯控制动词,我还没有太多机会在​​'非玩具'程序中使用它们。我发现通过(?>...)和占有量词*+++?+等的独立子表达式给了我足够的绳索,可以这么说。

那就是说,我在this answer中有一个使用(*FAIL)的玩具示例;这是第一个正则表达式解决方案。其存在的原因是我想迫使正则表达式引擎回溯所有可能的排列;真正的目标只是计算它尝试了多少种方式。

请理解我的两个正则表达式,以及来自其他人的许多非常有创意的答案,都是有趣的,诙谐的事情。尽管如此,一个可以从他们身上学到很多东西 - 一旦从震惊中恢复过来。 ☺

答案 1 :(得分:4)

^(?!.*foo bar).*$

这应该选择不包含“foo bar”的每一行。 (?!=负向前瞻)

答案 2 :(得分:2)

“删除除foo bar之外的所有内容”相当于“只查找foo bar”,PCRE很容易实现。相反,“查找除foo bar之外的所有内容”等同于“查找并删除foo bar”。因此,可以通过您的工具轻松完成补充。

除此之外,PCRE还有一个令人讨厌的小功能,称为*FAIL,当遇到它时会立即引起回溯。所以,我想在你的正则表达式中加入(*COMMIT)foo bar(*FAIL)这样的东西会有所帮助。不过,这既不友好也不安全。

答案 3 :(得分:1)

好的,您希望使用UltraEdit的“高级”(Perl-regex样式)搜索功能删除foo bar之外的所有内容。最简单的方法是匹配所有内容,但只能捕获 foo bar,如下所示:

(?:(?!foo bar).)+(foo bar|$)

...并将其替换为$1\1(UltraEdit接受的任何样式)。

我不使用UltraEdit,但在EditPadPro中它转换为:

ipsum dolor foo bar Lorem ipsum dolor sit amet,
consectetur adipisicing elit, sed do
eiusmod tempor foo bar incididunt ut labore et
dolore foo bar 

......对此:

foo bar

foo bar
foo bar

...这是您在原始邮件中显示的结果。

答案 4 :(得分:1)

此处:perl -pe 's{.*?(foo bar)?}{$1}g' <text

  

我想找到一切但是“foo bar”

不使用$ 1替换的匹配模式(可用于s {pattern} {}中的空替换)...不确定是否可行。你必须吞噬字符直到foo bar,例如与.*?(?=foo bar)。但随后匹配算法继续并看到“oo bar”,并且会再次匹配,因为没有f。

继续执行任务,这里有一段perl代码吞噬了所请求的部分,但缺点是如果foo bar恰好位于该行的开头,则可能会返回空捕获:

foreach (<>) {
        chomp;
        @_ = m{(.*?)(?:foo bar|$)}gs;
        print "[[ $_ ]]\n" for @_;
}

没有涉及替代品并且在Lorem ipsum测试文件上运行此代码将显示除foo bar部分之外的所有内容。它与PCRE兼容,但不能保证$ EDITOR会做你想象的。

答案 5 :(得分:1)

显示除“foo bar”和“fad bad”之外的所有内容,这对我有用:

^(?!.*foo bar)(?!.*fad bad).*$