我有这样的东西
aabbabcaabda
用于选择由 a 包裹的最小组,我有这个
/a([^a]*)a/
,效果很好
但是我对 aa 包裹的组有疑问,我需要类似的东西
/aa([^aa]*)aa/
不起作用,而且我不能像 /aa([^a]*)aa/
这样使用第一个,因为它会在第一次出现 a 时结束,这是我不想要的。
一般来说,有什么办法,怎么说不包含字符串,就像这样 我可以说不包含字符与
[^a]
?
简单地说,我需要 aa 后跟除序列 aa 之外的任何字符,然后以 aa
结尾借助 Google 的力量,我找到了2007 年的一篇博文,其中给出了以下正则表达式,该正则表达式与 不 包含某个子字符串的字符串相匹配:
^((?!my string).)*$
它的工作原理如下:它查找零个或多个(*)字符(.),这些字符不是字符串的开头(?! - 负向前瞻),并且它规定整个字符串必须由这些字符组成(通过使用^ 和 $ 锚点)。或者换一种说法:
整个字符串必须由不以给定字符串开头的字符组成,这意味着该字符串不包含给定的子字符串。
regex: /aa.*?aa/
aabbabcaabda => aabbabcaa
aaaaaabda => aaaa
aabbabcaabda => aabbabcaa
aababaaaabdaa => aababaa, aabdaa
您也可以使用负向前瞻,但在这种情况下,这只是完成相同任务的更详细的方法。而且,它比 gpojd 所描述的要复杂一些。在允许点消耗下一个字符之前,必须在每个位置应用前瞻。
/aa(?:(?!aa).)*aa/
至于 Claudiu 和 finnw 建议的方法,当哨兵字符串只有两个字符长时,它会工作正常,但是(正如 Claudiu 承认的那样)对于较长的字符串来说太笨重了。
<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”字符串,则从结果数组中丢弃该结果。这就是所谓的负向回顾。因为我花了一天的时间来了解如何做到这一点,所以我认为我应该分享。
在Java中,这将找到所有以“.ftl”结尾但不以“.inc.ftl”结尾的文件,这正是我想要的。