使用正则表达式如何匹配字符串中的所有东西?这可能没有意义,但请继续阅读。
因此,举个例句baby
来匹配不是 b
的所有内容,你会做[^b]
之类的事情,这会匹配{{} 1}}和a
。很简单!但是,我可以在此字符串y
中匹配不是Ben sits on a bench
的所有内容,以便我尝试匹配ben
吗?
更好地匹配一切不是模式的东西?例如在sits on a ch
中匹配的所有内容都不是1a2be3
,因此它会匹配除number,letter,number
以外的字符串中的每个组合?
答案 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)
如果你想要字符串列表,请使用“在正则表达式上拆分”而不是“在正则表达式上匹配”。