我有类似的东西
aabbabcaabda
选择通过包裹最小组一个我有这个/a([^a]*)a/
它工作得很好
但我有问题,由包组AA,在那里我需要像
/aa([^aa]*)aa/
它不工作,我不能用第一个喜欢/aa([^a]*)aa/
的,因为它会在中第一次出现的结束一个,我不想.
一般情况下,有没有什么办法,怎么说没有包含字符串以同样的方式,我可以说,不包含字符用[^a]
?
简单地说,我需要aa后跟除序列aa之外的任何字符,然后以aa结尾
通过谷歌的力量,我发现2007年的一个博客文章,它提供了以下正则表达式匹配不包含某个子字符串的字符串:
^((?!my string).)*$
它的工作原理如下:它查找零个或多个(*)字符(.),它们不会开始(?! - 否定前瞻)你的字符串,它规定整个字符串必须由这些字符组成(通过使用^和$ anchors).或者换一种说法:
整个字符串必须由不开始给定字符串的字符组成,这意味着该字符串不包含给定的子字符串.
一般来说,编写一个不包含特定字符串的正则表达式会很痛苦.我们必须为计算模型执行此操作 - 您可以使用NFA,这很容易定义,然后将其缩减为正则表达式.不包含"cat"的东西的表达式大约有80个字符.
编辑:我刚刚完成,是的,它是:
aa([^a] | a[^a])aa
这是一个非常简短的教程.之前我发现了一些很棒的东西,但我再也看不到它们了.
你所需要的只是一个不情愿的量词:
regex: /aa.*?aa/ aabbabcaabda => aabbabcaa aaaaaabda => aaaa aabbabcaabda => aabbabcaa aababaaaabdaa => aababaa, aabdaa
你也可以使用负向前瞻,但在这种情况下,它只是一种更加冗长的方式来完成同样的事情.而且,它比gpojd做得有点棘手.在允许点消耗下一个字符之前,必须在每个位置应用前瞻.
/aa(?:(?!aa).)*aa/
至于Claudiu和finnw建议的方法,当哨兵字符串只有两个字符长时它会工作正常,但是(正如Claudiu所承认的那样)它对于更长的字符串来说太笨重了.
/aa([^a]|a[^a])*aa/
我不确定它是一个标准结构,但我认为你应该看看"负向前瞻"(写道:"?!",没有引号).它比这个帖子中的所有答案都容易得多,包括被接受的答案.
示例:正则表达式:"^(?!123)[0-9]*\w"捕获以数字开头,后跟字母的任何字符串,如果"这些数字"为123,则为UNLESS.
用于前瞻/后视的http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs(微软页面,但相当全面)
PS:它适用于我(.Net).但如果我对某事有误,请告诉我们.我发现这个结构非常简单有效,所以我对接受的答案感到惊讶.