我有这样的东西
阿巴布卡布达
为了选择由a包裹的最小组,我有这个/a([^a]*)a/
,它工作得很好
但是我对由aa包裹的组有问题,我需要类似
/aa([^aa]*)aa/
的东西不起作用,而且我不能使用第一个 like /aa([^a]*)aa/
,因为它会在第一次出现时结束a,我不想要.
一般来说,有什么办法可以说不包含字符串,就像我可以说不包含字符一样[^a]
?
简单地说,我需要aa后跟除序列aa之外的任何字符,然后以aa结尾
我有这样的东西
阿巴布卡布达
为了选择由a包裹的最小组,我有这个/a([^a]*)a/
,它工作得很好
但是我对由aa包裹的组有问题,我需要类似
/aa([^aa]*)aa/
的东西不起作用,而且我不能使用第一个 like /aa([^a]*)aa/
,因为它会在第一次出现时结束a,我不想要.
一般来说,有什么办法可以说不包含字符串,就像我可以说不包含字符一样[^a]
?
简单地说,我需要aa后跟除序列aa之外的任何字符,然后以aa结尾
借助Google 的力量,我找到了 2007 年的一篇博文,其中给出了以下匹配不包含特定子字符串的字符串的正则表达式:
^((?!my string).)*$
它的工作原理如下:它查找零个或多个 (*) 字符 (.),这些字符 (.) 不以您的字符串开头 (?! - 负前瞻),并规定整个字符串必须由这些字符组成 (通过使用 ^和 $ 锚)。或者换一种说法:
整个字符串必须由不以给定字符串开头的字符组成,这意味着该字符串不包含给定的子字符串。
一般来说,编写一个不包含特定字符串的正则表达式是很痛苦的。我们必须为计算模型执行此操作 - 您采用 NFA,它很容易定义,然后将其简化为正则表达式。不包含“猫”的事物的表达式大约有 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。
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”字符串,则从结果数组中丢弃该结果。这就是所谓的消极回顾。因为我花了一天的时间来找出如何做到这一点,所以我想我应该分享一下。
".*[^(\\.inc)]\\.ftl$"
在 Java 中,这将找到所有以“.ftl”结尾但不以“.inc.ftl”结尾的文件,这正是我想要的。