正则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”结尾,这正是我想要的。