正则表达式,用于匹配不是字符串“ABCD”的任何内容

Regular expression to match anything that isn't the string "ABCD"

本文关键字:ABCD 任何内 字符串 用于 正则表达式      更新时间:2023-09-26

如何编写一个与给定字符串("ABCD")以外的所有内容匹配的Javascript正则表达式?

类似于/[^ABCD]/,除了我不想匹配所有不是字母 A、B、C 或 D 的东西。我想匹配所有不是字符串"ABCD"的内容。

基本上我希望发生这种情况:

var myStr = "ABCA ABCB ABCD BCD ABC"
myStr.replace(/!(ABCD)/g,'') // returns ABCD

您可以简单地检查ABCD,检查字符串中存在多少个,然后像这样从中构造一个新字符串(如果它更适合您的情况,您可以使用空格作为分隔符):

var res = myStr.match(/ABCD/g);
var str = res ? res.join('') : '';
  • jsFiddle 演示
  • String.match()
  • Array.join()

三元之所以存在,是因为如果match()什么也没找到,它将返回null - 它没有join()方法。

好吧

,我误解了这个问题。 似乎您想测试是否存在 ABCD ,如果找到它,请将整个字符串替换为:ABCD . 这将做到这一点:

s = s.replace(/.*(ABCD).*/, '$1');

但是,如果字符串中没有ABCD,它将保持字符串不变。 如果要在这种情况下删除字符串,则必须使捕获成为可选。 但是,您必须更改正则表达式的第一部分,使其"偷偷摸摸"捕获:

s = s.replace(/^(?:(?!ABCD).)*((?:ABCD)?).*$/, '$1');

这迫使它试图在每个位置捕获ABCD。 (它也会大大减慢速度 - 在这种情况下不是问题,但是如果您在大型输入上使用这种技术,请记住这一点。

所以纯正则表达式解决方案确实存在,但我更喜欢@bažmegakapa的解决方案。 :D


原答案:

/^(?!ABCD$).*/

请注意,这也将匹配空字符串。 如果您有任何积极的要求,您可以将.*更改为您需要的任何内容。 例如,要匹配一个或多个大写 ASCII 字母,但不匹配确切的字符串ABCD,您可以使用:

/^(?!ABCD$)[A-Z]+$/

尝试一下:

var myStr = "ABCA ABCB ABCD BCD ABC";
var foo = myStr.replace(/'b(?!ABCD'b)'w+'b/g,'').trim(); // returns ABCD
document.write(foo);

输出:ABCD

或:

var myStr = "ABCA ABCB ABCD BCD ABCD ABC";
var foo = myStr.replace(/'b(?!ABCD'b)'w+'b/g,'').replace(/'s/g, '');
document.write(foo);

输出:ABCDABCD

这是否定的直接展开,不使用否定运算符:

/^'([^a]'|a[^b]'|ab[^c]'|abc[^d]')*$'|^a$'|^ab$'|^abc$/

当您将否定运算符调用为某种语言时,它会将要否定的表达式转换为类似于上层形式的表达式。


以下是我测试它的方式:

@ThinkPad-T420:~$ E='/^'([^a]'|a[^b]'|ab[^c]'|abc[^d]')*$'|^a$'|^ab$'|^abc$/ p;d'
@ThinkPad-T420:~$ echo abc | sed "$E"
abc
@ThinkPad-T420:~$ echo abcd | sed "$E"
@ThinkPad-T420:~$ echo abcde | sed "$E"
@ThinkPad-T420:~$ echo axbcde | sed "$E"
axbcde
@ThinkPad-T420:~$ echo xxabcde | sed "$E"
@ThinkPad-T420:~$ 
相关文章: