使用regex,如何才能将字符串中的所有东西匹配起来?这可能没有意义,但继续读下去。
因此,以单词baby为例,为了匹配所有不是b的内容,您将执行类似于[^b]的操作,这将匹配a和y。够简单了!但是在这个字符串Ben sits on a bench中,我如何能够匹配所有不是ben的东西,所以我将尝试匹配sits on a ch
更好的匹配所有不是模式的东西?例如,在1a2be3中,所有不是number,letter,number的内容都匹配,所以它将匹配字符串中的每个组合,但1a2除外
发布于 2013-12-17 09:58:29
(?:ben)|(.)这个正则表达式所做的是匹配ben或任何其他字符,但是没有捕获ben,但其他字符是。所以,除了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])|(.)发布于 2014-01-28 09:09:16
简短的回答:你不能按你的要求去做。从技术上讲,第一部分有一个丑陋的答案,但第二部分(据我理解)没有答案。
对于您的第一部分,我有一个非常不切实际(但却是纯正则表达式)的答案;任何更好的答案都需要代码(比如上面@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“一部分的迭代。就像我说的,不太实际,即使我是在技术上回答你的问题。如果您需要更详细的信息,我还保存了对这个正则表达式的逐个解释。
如果您被迫使用纯正则表达式而不是代码,那么最好的选择是编写代码来生成regex。这样你就可以保存一份干净的副本了。
我不知道您对剩下的挑战要求什么;正则表达式要么是贪婪的,要么是懒惰的[1] [2],而且我不知道有任何实现可以找到“每个组合”,而不仅仅是通过这两种方法进行的第一个组合。如果有这样的东西,它在现实生活中会非常慢(而不是快速的例子);如果regex引擎的缓慢速度是无法忍受的,如果他们被迫检查每一种可能性,这基本上是一个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 2b 2be 2be3 b be be3 e e3 3,但我不认为您可以使用纯正则表达式。您需要一些代码来生成每个子字符串,然后可以使用regex筛选出禁止的模式(同样,这是关于贪婪的还是懒惰的与ReDoS的)。
发布于 2013-12-10 11:08:27
如果您想匹配所有的单词,除了一个,您可以使用负面展望:\b(?!ben\b)\w*\b,但对于您的确切问题的答案,乔恩的评论似乎是最简单的。
https://stackoverflow.com/questions/20492477
复制相似问题