正则表达式匹配任何不是字符串“ABCD”的东西

时间:2012-08-09 22:39:34

标签: javascript regex string

如何编写一个除了给定字符串(“ABCD”)之外的所有内容的Javascript正则表达式?

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

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

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

4 个答案:

答案 0 :(得分:5)

您只需检查ABCD,检查字符串中存在多少字符串,然后像这样构建一个新字符串(如果更适合您的情况,可以使用空格作为分隔符):< / p>

var res = myStr.match(/ABCD/g);
var str = res ? res.join('') : '';

三元组存在,因为match()如果找不到任何内容将会返回null - 它没有join()方法。

答案 1 :(得分:3)

好吧,我误解了这个问题。您似乎想测试ABCD的存在,如果找到它,请将整个字符串替换为:ABCD。这样就可以了:

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

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

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

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

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


原始回答:

/^(?!ABCD$).*/

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

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

答案 2 :(得分:0)

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

/^\([^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:~$ 

答案 3 :(得分:0)

试试这个:

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