正则表达式,不包含某些字符串

时间:2009-04-04 19:22:39

标签: regex regex-negation

我有类似的东西

  

aabbabcaabda

选择由 a 包裹的最小群组我有/a([^a]*)a/这样可以正常使用

但我对包含 aa 的群组有疑问,我需要这样的东西 /aa([^aa]*)aa/哪个不起作用,我不能使用/aa([^a]*)aa/之类的第一个,因为它会在 a 的第一次出现时结束,我不想要

一般来说,有没有办法,怎么说 不包含字符串 的方式与 我可以用[^a] 不包含字符 吗?

简单地说,我需要 aa ,然后是除序列 aa 之外的任何字符,然后以 aa

7 个答案:

答案 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”结尾的所有文件,这正是我想要的。