匹配任何东西?

时间:2013-12-10 10:52:34

标签: regex

使用正则表达式如何匹配字符串中的所有东西?这可能没有意义,但请继续阅读。

因此,举个例句baby来匹配不是 b的所有内容,你会做[^b]之类的事情,这会匹配{{} 1}}和a。很简单!但是,我可以在此字符串y中匹配不是Ben sits on a bench的所有内容,以便我尝试匹配ben吗?

更好地匹配一切不是模式的东西?例如在sits on a ch中匹配的所有内容都不是1a2be3,因此它会匹配除number,letter,number以外的字符串中的每个组合?

6 个答案:

答案 0 :(得分:1)

(?:ben)|(.)

此正则表达式的作用是匹配ben或任何其他字符,但是,ben未捕获,但其他字符为。{1}}。所以除了ben之外,你最终会得到很多匹配。然后你可以将所有这些匹配加在一起,得到没有ben的字符串。

这是python中的一个例子。

import re

thestr = "Ben sits on a bench"
regex = r'(?:ben)|(.)'

matches = re.findall(regex, thestr, re.IGNORECASE)
print ''.join(matches)

这将输出:

 sits on a ch

注意领先的空间。你当然可以通过添加.strip()来消除它。

另请注意,使用空字符串替换ben以获得相同结果的正则表达式可能更快。但是如果你想在更复杂的正则表达式中使用这种技术,它可以派上用场。

当然,您也可以在ben的位置放置更复杂的正则表达式,例如,您的number,letter,number示例将是:

(?:[0-9][a-z][0-9])|(.)

答案 1 :(得分:1)

简短的回答:你不能做你所要求的。从技术上讲,第一部分有一个难看的答案,但第二部分(据我所知)没有答案。


对于你的第一部分,我有一个非常不切实际(纯正的正则表达式)的答案;任何更好的东西都需要代码(比如上面的@ rednaw更清晰的回答)。我加入了测试,使其更加全面。 (为简单起见,我使用grep -Pio表示PCRE,不区分大小写,每行打印一个匹配项。)

$ echo "Ben sits on a bench better end" \
    |grep -Pio '(?=b(?!en)|(?<!b)en|e(?!n)|(?<!be)n|[^ben])\w+'
sits
on
a
ch
better
end

我基本上为“ben”中的任何字母制作一个特例,所以我只能包含那些本身不属于字符串“ben”的迭代。正如我所说,即使我在技术上回答你的问题,也不是很实际。如果您想了解更多细节,我还保存了a blow-by-blow explanation of this regex

如果您被迫使用纯正则表达式而不是代码,那么对于这样的项目,最好的选择是将代码写入生成正则表达式。这样你就可以保留一份干净的副本。


我不确定你要求的剩余挑战是什么;正则表达式是贪婪的或懒惰的[1] [2],我不知道任何可以找到“每个组合”的实现,而不仅仅是任何一种方法的第一个组合。如果有这样的事情,那在现实生活中会非常缓慢(而不是简单的例子);如果他们被迫检查所有可能性,那么正则表达式引擎的速度慢是不可容忍的,这基本上是ReDoS

示例:

# greedy evaluation (default)
$ echo 1a2be3 |grep -Pio '(?!\d[a-z]\d)\w+'
a2be3

# lazy evaluation
$ echo 1a2be3 |grep -Pio '(?!\d[a-z]\d)\w+?'
a
2
b
e
3

我假设您正在寻找1 1a a a2 a2b a2be a2be3 2 { {1}} 2b 2be 2be3 b be be3 e e3但我不认为你可以用纯正则表达式获得它。您需要一些代码来生成每个子字符串,然后您可以使用正则表达式来过滤掉禁止的模式(同样,这是关于贪婪与懒惰与ReDoS的关系)。

答案 2 :(得分:0)

如果你想匹配除了一个以外的所有单词,你可以使用否定前瞻:\b(?!ben\b)\w*\b,但是对于你的确切问题的答案,Jon的评论似乎是最简单的。

答案 3 :(得分:0)

好的,最简单的事情就是匹配一切

(.*?)

然后在匹配的模式上执行另一个匹配您不想要的内容(例如,在perl中,您将在变量$&amp;中匹配模式。)

如果匹配,那就不是你想要的,否则就是你的匹配。

简单的A-B,其中A是一切(。*?),B是你不想要的东西。所以你最终做了两场比赛,但我认为那很好。

答案 4 :(得分:0)

只需用空白替换匹配模式的所有内容(删除它)。

你没有说明你正在使用什么语言,所以遗传:

s/ben//g

和你的另一个例子:

s/\d[a-zA-Z]\d//g

答案 5 :(得分:0)

如果你想要字符串列表,请使用“在正则表达式上拆分”而不是“在正则表达式上匹配”。