如何编写一个除了给定字符串(“ABCD”)之外的所有内容的Javascript正则表达式?
像/[^ABCD]/
之类的东西,除了我不想匹配不是字母A,B,C或D的所有内容。我想匹配不是字符串“ABCD”的所有内容。
基本上我希望这种情况发生:
var myStr = "ABCA ABCB ABCD BCD ABC"
myStr.replace(/!(ABCD)/g,'') // returns ABCD
答案 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