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