正则expression式,不包含某些string

我有这样的事情

aabbabcaabda

为select最小的组包裹我有这个/a([^a]*)a/工作得很好

但是我有一个由aa包裹的问题,在那里我需要类似/aa([^aa]*)aa/这不起作用,而且我不能使用第一个/aa([^a]*)aa/ ,因为它会在第一次出现时结束,我不想要。

一般来说,有什么办法,怎么说不包含string ,就像我可以说不包含字符 [^a]

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

一般来说写一个包含特定string的正则expression式是很痛苦的。 我们必须为计算模型做到这一点 – 你需要一个NFA,这个NFA很容易定义,然后把它减less到一个正则expression式。 不包含“猫”的东西的expression是大约80个字符长。

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

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

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

通过谷歌的力量,我发现了一个2007年的博客post,它给出了下面的正则expression式,该正则expression式匹配包含特定子string的string:

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

它的工作原理如下:它查找零或多个(*)字符(。),它们不会开始(?! – 负向查找)string,它规定整个string必须由这些字符组成(使用^和$锚)。 或者换一种说法:

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

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

 regex: /aa.*?aa/ aabbabcaabda => aabbabcaa aaaaaabda => aaaa aabbabcaabda => aabbabcaa aababaaaabdaa => aababaa, aabdaa 

您也可以使用负向预测,但在这种情况下,它只是一个更详细的方式来完成相同的事情。 另外,它比gpojd更复杂一点。 在点被允许消耗下一个字符之前,必须在每个位置应用前瞻。

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

至于Claudiu和finnw提出的方法,当哨兵string只有两个字符时,它可以正常工作,但是(正如Claudiu所承认的)对于更长的string来说太笨拙了。

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

我不确定这是一个标准的构造,但我认为你应该看看“负面的看法”(写道:“?!”,没有引号)。 这个线程比所有的答案都要容易得多,包括被接受的答案。

示例:正则expression式:“^(?! 123)[0-9] * \ w”捕获以数字开头的字母开头的任何string,如果“这些数字”是123,则除外。

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

PS:它适合我(.Net)。 但如果我错了什么,请告诉我们。 我觉得这个构造非常简单有效,所以我对这个被接受的答案感到惊讶。

我下面的代码,我不得不添加一个GET参数的JS文件的所有引用除了一个。

 <link rel="stylesheet" type="text/css" href="/login/css/ABC.css" /> <script type="text/javascript" language="javascript" src="/localization/DEF.js"></script> <script type="text/javascript" language="javascript" src="/login/jslib/GHI.js"></script> <script type="text/javascript" language="javascript" src="/login/jslib/md5.js"></script> sendRequest('/application/srvc/EXCEPTION.js', handleChallengeResponse, null); sendRequest('/application/srvc/EXCEPTION.js",handleChallengeResponse, null); 

这是使用的匹配器:

 (?<!EXCEPTION)(\.js) 

所做的是查找所有“.js”,如果前面有“EXCEPTION”string,则放弃结果数组的结果。 这就是负面的后顾之忧。 因为我花了一天的时间找出如何做到这一点,我以为我应该分享。

 ".*[^(\\.inc)]\\.ftl$" 

在Java中,这将find所有以“.ftl”结尾的文件,但不以“.inc.ftl”结尾,这正是我想要的。