当前位置:  开发笔记 > 编程语言 > 正文

正则表达式,不包含某些字符串

如何解决《正则表达式,不包含某些字符串》经验,为你挑选了5个好方法。

我有类似的东西

aabbabcaabda

选择通过包裹最小组一个我有这个/a([^a]*)a/它工作得很好

但我有问题,由包组AA,在那里我需要像 /aa([^aa]*)aa/它不工作,我不能用第一个喜欢/aa([^a]*)aa/的,因为它会在中第一次出现的结束一个,我不想.

一般情况下,有没有什么办法,怎么说没有包含字符串以同样的方式,我可以说,不包含字符[^a]

简单地说,我需要aa后跟除序列aa之外的任何字符,然后以aa结尾



1> Grey Panther..:

通过谷歌的力量,我发现2007年的一个博客文章,它提供了以下正则表达式匹配包含某个子字符串的字符串:

^((?!my string).)*$

它的工作原理如下:它查找零个或多个(*)字符(.),它们不会开始(?! - 否定前瞻)你的字符串,它规定整个字符串必须由这些字符组成(通过使用^和$ anchors).或者换一种说法:

整个字符串必须由不开始给定字符串的字符组成,这意味着该字符串不包含给定的子字符串.


根据文件,这是负面的前瞻,而不是后视

2> Claudiu..:

一般来说,编写一个包含特定字符串的正则表达式会很痛苦.我们必须为计算模型执行此操作 - 您可以使用NFA,这很容易定义,然后将其缩减为正则表达式.不包含"cat"的东西的表达式大约有80个字符.

编辑:我刚刚完成,是的,它是:

aa([^a] | a[^a])aa

这是一个非常简短的教程.之前我发现了一些很棒的东西,但我再也看不到它们了.



3> Alan Moore..:

你所需要的只是一个不情愿的量词:

regex: /aa.*?aa/

aabbabcaabda   => aabbabcaa

aaaaaabda      => aaaa

aabbabcaabda   => aabbabcaa

aababaaaabdaa  => aababaa, aabdaa

你也可以使用负向前瞻,但在这种情况下,它只是一种更加冗长的方式来完成同样的事情.而且,它比gpojd做得有点棘手.在允许点消耗下一个字符之前,必须在每个位置应用前瞻.

/aa(?:(?!aa).)*aa/

至于Claudiu和finnw建议的方法,当哨兵字符串只有两个字符长时它会工作正常,但是(正如Claudiu所承认的那样)它对于更长的字符串来说太笨重了.



4> finnw..:
/aa([^a]|a[^a])*aa/



5> AFract..:

我不确定它是一个标准结构,但我认为你应该看看"负向前瞻"(写道:"?!",没有引号).它比这个帖子中的所有答案都容易得多,包括被接受的答案.

示例:正则表达式:"^(?!123)[0-9]*\w"捕获以数字开头,后跟字母的任何字符串,如果"这些数字"为123,则为UNLESS.

用于前瞻/后视的http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs(微软页面,但相当全面)

PS:它适用于我(.Net).但如果我对某事有误,请告诉我们.我发现这个结构非常简单有效,所以我对接受的答案感到惊讶.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有