好的,所以我有一个短语“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日:最好使用您选择的语言搜索和替换功能,只是“删除”您不想要的短语,这样您就会得到您所做的信息想。
答案 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).*$