首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >配上什么东西吗?

配上什么东西吗?
EN

Stack Overflow用户
提问于 2013-12-10 10:52:33
回答 5查看 405关注 0票数 8

使用regex,如何才能将字符串中的所有东西匹配起来?这可能没有意义,但继续读下去。

因此,以单词baby为例,为了匹配所有不是b的内容,您将执行类似于[^b]的操作,这将匹配ay。够简单了!但是在这个字符串Ben sits on a bench中,我如何能够匹配所有不是ben的东西,所以我将尝试匹配sits on a ch

更好的匹配所有不是模式的东西?例如,在1a2be3中,所有不是number,letter,number的内容都匹配,所以它将匹配字符串中的每个组合,但1a2除外

EN

回答 5

Stack Overflow用户

发布于 2013-12-17 09:58:29

代码语言:javascript
运行
复制
(?:ben)|(.)

这个正则表达式所做的是匹配ben或任何其他字符,但是没有捕获ben,但其他字符是。所以,除了ben之外,你会得到很多匹配,然后你可以把所有的匹配连接在一起,得到没有ben的字符串。

这里是python的一个例子。

代码语言:javascript
运行
复制
import re

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

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

这将产生:

代码语言:javascript
运行
复制
 sits on a ch

注意前面的空格。当然,您可以通过添加.strip()来消除这个问题。

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

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

代码语言:javascript
运行
复制
(?:[0-9][a-z][0-9])|(.)
票数 1
EN

Stack Overflow用户

发布于 2014-01-28 09:09:16

简短的回答:你不能按你的要求去做。从技术上讲,第一部分有一个丑陋的答案,但第二部分(据我理解)没有答案。

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

代码语言:javascript
运行
复制
$ 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

示例:

代码语言:javascript
运行
复制
# 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的)。

票数 1
EN

Stack Overflow用户

发布于 2013-12-10 11:08:27

如果您想匹配所有的单词,除了一个,您可以使用负面展望:\b(?!ben\b)\w*\b,但对于您的确切问题的答案,乔恩的评论似乎是最简单的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20492477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档