不区分大小写的正则表达式匹配,但不匹配特定大小写

3
我是一名有帮助的助手,以下是您需要翻译的内容:

我正在寻找一个正则表达式(在JS中,但我认为这并不重要),它可以匹配某个字符串的所有大写/小写可能性,但排除其中一种情况。

例如:假设我的字符串是"aBc"。那么我的正则表达式应该如下匹配:

var regex=/ABC|ABc|AbC|Abc|aBC|abC|abc/g;

在这种情况下,可以将其拼写出来,但通常具有n个单词字符的字符串允许匹配2^n-1个字符串。对于大的n,这不再是一个良好的缩放。因此,我正在寻找另一种方法。

编辑:由于许多人似乎没有理解我的观点:正则表达式不能匹配"aBc"。所以它就像/abc/i,但不是/aBc/。

为了简单起见,您可以在此处检查您的表达式是否按照预期执行:http://regex101.com/r/kP5aX2

您的正则表达式应与我的完全匹配。


尝试使用 /[a-c]+/i,注意 /i 部分。 - Dayan Moreno Leon
这将匹配"aBc"和许多其他我不想匹配的字符串,如"a","cba"等。 - principal-ideal-domain
所以,只是为了确认我理解你的意思,在这个例子中,您想匹配字符串abc的任何大小写,但不包括aBc - Mike H-R
是的。正则表达式应该与给定的一样匹配,但不需要列举出所有可能的匹配。 - principal-ideal-domain
5个回答

4

尝试

var regex = /(?!aBc)[a-cA-C]{3}/g;

(?!aBc)是所谓的负向先行断言,它应该能实现您想要的功能。

更新:

参考评论...

var regex = /((?![a-zA-Z]*aBc[a-zA-Z]*)[a-zA-Z]*[aA][bB][cC][a-zA-Z]*)/g;

更新2

如果你不想匹配整个单词,而只是3个字符的字符串,你应该这样做

var regex = /(?!aBc)[aA][bB][cC]/g; 

see http://regex101.com/r/jQ3hS8


此外,它并不匹配 "qabc",尽管该字符串包含 "abc"。 - principal-ideal-domain
好的,在这种情况下,我没有理解问题。请查看我的更新,它也符合您的要求...但有点混乱,可能需要优化... - nozzleman
非常感谢,你让我找到了我提交的解决方案。 - principal-ideal-domain

0
假设您的字符串只是'abc'或'AbC'等,那么这将起作用:
/(?!aBc)[aA][bB][cC]/g

我猜 /^(?!aBc)[aA][bB][cC]/g 做的事情是一样的,但更短。问题是我想在一段长文本中查找这样的表达式。因此,如果它只匹配开头出现的情况是不够的。 - principal-ideal-domain
1
我在我的问题中添加了一个检查。希望这能帮到你。谢谢你试图帮助我! - principal-ideal-domain

0

这样怎么样:

/\b(?!aBc)(?i)abc\b/

这将匹配所有像abcabC,…但不包括aBc的单词。

如果您想匹配单词中的abc,请删除单词边界:

/(?!aBc)(?i)abc/

@principal-ideal-domain:只需删除单词边界即可。请查看我的编辑。 - Toto

0

由于Nozzleman,我找到了一个非常不错的解决方案:

var regex=/(?!aBc)(?i)aBc/g;

我非常喜欢这个解决方案,因为你可以插入任何其他字符串而不是"aBc"(由于该字符串在正则表达式中出现两次,因此您只需要执行两次)。这就是我一直在寻找的解决方案类型,因为我需要将表达式用于许多不同长度的字符串。


0

为了匹配不是小写字母-大写字母-小写字母形式的abc,请使用以下模式:
(?![a-z][A-Z][a-z])(?i)abc
演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接