2

好的,所以我有一个短语“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 日更新:最好使用您选择的语言中的搜索和替换功能来“删除”您不想要的短语,这样您就可以得到您想要的信息。

4

6 回答 6

9

一般来说,如果foobar匹配自身,则(?s:(?!foobar).)*匹配任何不是 foobar的,包括什么都不匹配。

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

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

您还可以使用您的语言的split()功能来拆分 foobar这将为您提供所有包括拆分模式的部分。

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

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

请理解,我在那里的两个正则表达式,以及来自其他人的许多非常有创意的答案,都是为了有趣、半开玩笑的事情。尽管如此,人们还是可以从他们身上学到很多东西——一旦从震惊中恢复过来。☺</p>

于 2010-11-06T02:31:28.440 回答
4

尝试

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

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

于 2010-11-16T15:41:09.460 回答
2

“删除除 foo bar 之外的所有内容”等同于“仅查找 foo bar”,PCRE 很容易做到这一点。相反,“查找除 foo bar 之外的所有内容”等同于“仅查找并删除 foo bar”。因此,可以通过您的工具轻松完成互补。

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

于 2010-11-05T19:13:47.863 回答
1

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

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

...并将其替换为$1or \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

...这是您在原始消息中显示的结果。

于 2010-11-18T00:38:29.880 回答
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 (<>) {
        咀嚼;
        @_ = m{(.*?)(?:foo bar|$)}gs;
        为@_打印“[[ $_ ]]\n”;
}

不涉及任何替代,在 Lorem ipsum 测试文件上运行它会显示除foo bar零件以外的所有内容。它与 PCRE 兼容,但不能保证 $EDITOR 会按照您的设想进行。

于 2010-11-21T21:15:40.087 回答
1

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

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

于 2013-06-16T04:00:16.723 回答