83

我有这样的东西

阿巴布卡布达

为了选择由a包裹的最小组,我有这个/a([^a]*)a/,它工作得很好

但是我对由aa包裹的组有问题,我需要类似 /aa([^aa]*)aa/的东西不起作用,而且我不能使用第一个 like /aa([^a]*)aa/,因为它会在第一次出现时结束a,我不想要.

一般来说,有什么办法可以说不包含字符串,就像我可以说不包含字符一样[^a]

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

4

7 回答 7

217

借助Google 的力量,我找到了 2007 年的一篇博文,其中给出了以下匹配包含特定子字符串的字符串的正则表达式:

^((?!my string).)*$

它的工作原理如下:它查找零个或多个 (*) 字符 (.),这些字符 (.) 不以您的字符串开头 (?! - 负前瞻),并规定整个字符串必须由这些字符组成 (通过使用 ^和 $ 锚)。或者换一种说法:

整个字符串必须由不以给定字符串开头的字符组成,这意味着该字符串不包含给定的子字符串。

于 2010-03-05T13:39:50.977 回答
19

一般来说,编写一个包含特定字符串的正则表达式是很痛苦的。我们必须为计算模型执行此操作 - 您采用 NFA,它很容易定义,然后将其简化为正则表达式。不包含“猫”的事物的表达式大约有 80 个字符长。

编辑:我刚刚完成,是的,它是:

aa([^a] | a[^a])aa

是一个非常简短的教程。我以前发现了一些很棒的,但我再也看不到它们了。

于 2009-04-04T19:30:55.197 回答
10

您只需要一个不情愿的量词:

regex: /aa.*?aa/

aabbabcaabda   => aabbabcaa

aaaaaabda      => aaaa

aabbabcaabda   => aabbabcaa

aababaaaabdaa  => aababaa, aabdaa

您也可以使用负前瞻,但在这种情况下,它只是完成同一件事的一种更冗长的方式。此外,它比 gpojd 看起来要复杂一些。在允许点使用下一个字符之前,必须在每个位置应用前瞻。

/aa(?:(?!aa).)*aa/

至于 Claudiu 和 finnw 建议的方法,当哨兵字符串只有两个字符长时它可以正常工作,但是(正如 Claudiu 承认的)对于较长的字符串来说太笨拙了。

于 2009-04-05T07:32:50.500 回答
7
/aa([^a]|a[^a])*aa/
于 2009-04-04T19:24:20.363 回答
6

我不确定它是一个标准构造,但我认为你应该看看“负前瞻”(写:“?!”,不带引号)。它比该线程中的所有答案(包括已接受的答案)要容易得多。

示例:正则表达式:“^(?!123)[0-9]*\w” 捕获任何以数字开头的字符串,后跟字母,除非“这些数字”是 123。

http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs (微软页面,但非常全面)用于前瞻/后视

PS:它对我很有效(.Net)。但是,如果我在某些方面有误,请告诉我们。我发现这个结构非常简单有效,所以我对接受的答案感到惊讶。

于 2014-11-21T11:27:02.157 回答
4

我必须替换以下代码,将 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”字符串,则从结果数组中丢弃该结果。这就是所谓的消极回顾。因为我花了一天的时间来找出如何做到这一点,所以我想我应该分享一下。

于 2012-11-22T12:18:51.067 回答
3
".*[^(\\.inc)]\\.ftl$"

在 Java 中,这将找到所有以“.ftl”结尾但不以“.inc.ftl”结尾的文件,这正是我想要的。

于 2011-12-01T19:17:13.187 回答