不包含特定字符串的正则表达式[重复]

问题描述 投票:0回答:7

我有这样的东西

aabbabcaabda

用于选择由 a 包裹的最小组,我有这个

/a([^a]*)a/
,效果很好

但是我对 aa 包裹的组有疑问,我需要类似的东西

/aa([^aa]*)aa/
不起作用,而且我不能像
/aa([^a]*)aa/
这样使用第一个,因为它会在第一次出现 a 时结束,这是我不想要的。

一般来说,有什么办法,怎么说不包含字符串,就像这样 我可以说不包含字符

[^a]

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

结尾
regex regex-negation
7个回答
236
投票

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

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

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

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


20
投票

一般来说,编写不包含特定字符串的正则表达式是很痛苦的。对于计算模型,我们必须这样做 - 你采用一个很容易定义的 NFA,然后将其简化为正则表达式。不包含“猫”的事物的表达大约有 80 个字符长。 编辑:我刚刚完成,是的,它是:

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

这里

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


12
投票

regex: /aa.*?aa/ aabbabcaabda => aabbabcaa aaaaaabda => aaaa aabbabcaabda => aabbabcaa aababaaaabdaa => aababaa, aabdaa

您也可以使用负向前瞻,但在这种情况下,这只是完成相同任务的更详细的方法。而且,它比 gpojd 所描述的要复杂一些。在允许点消耗下一个字符之前,必须在每个位置应用前瞻。

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

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


7
投票


6
投票

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

http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs

(微软页面,但相当全面)用于前向/后向 PS:它对我来说效果很好(.Net)。但如果我做错了什么,请告诉我们。我发现这个结构非常简单有效,所以我对接受的答案感到惊讶。


5
投票

<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”字符串,则从结果数组中丢弃该结果。这就是所谓的负向回顾。因为我花了一天的时间来了解如何做到这一点,所以我认为我应该分享。


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

© www.soinside.com 2019 - 2024. All rights reserved.