如何编写一个匹配除给定字符串(“ABCD”)之外的所有内容的 Javascript 正则表达式?
除了/[^ABCD]/
我不想匹配不是字母 A、B、C 或 D 的所有内容之外,我想匹配不是字符串“ABCD”的所有内容。
基本上我希望这种情况发生:
var myStr = "ABCA ABCB ABCD BCD ABC"
myStr.replace(/!(ABCD)/g,'') // returns ABCD
如何编写一个匹配除给定字符串(“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('') : '';
三元组在那里是因为如果它什么也没找到,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
这是 negation 的直接扩展,不使用否定运算符:
/^\([^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:~$