Javascript 正则表达式来匹配任何非';t字符串“;ABCD";

Javascript 正则表达式来匹配任何非';t字符串“;ABCD";,javascript,regex,string,Javascript,Regex,String,如何编写一个Javascript正则表达式来匹配除了给定字符串(“ABCD”)之外的所有内容 类似于/[^ABCD]/的内容,但我不想匹配字母A、B、C或D以外的所有内容。我想匹配字符串“ABCD”以外的所有内容 基本上,我希望这种情况发生: var myStr = "ABCA ABCB ABCD BCD ABC" myStr.replace(/!(ABCD)/g,'') // returns ABCD 您只需检查ABCD,检查字符串中存在多少,然后像这样从中构造一个新字符串(如果更适合您的大

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

类似于
/[^ABCD]/
的内容,但我不想匹配字母A、B、C或D以外的所有内容。我想匹配字符串“ABCD”以外的所有内容

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

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

您只需检查
ABCD
,检查字符串中存在多少,然后像这样从中构造一个新字符串(如果更适合您的大小写,您可以使用空格作为分隔符):


三元之所以存在,是因为
match()。您似乎想测试是否存在
ABCD
,如果找到了,请将整个字符串替换为:
ABCD
。这将做到:

s = s.replace(/.*(ABCD).*/, '$1');
但是如果字符串中没有
ABCD
,它将保持字符串不变。如果在这种情况下要删除字符串,则必须将捕获设置为可选。但是,您必须修改正则表达式的第一部分,使其在捕获时“悄悄地”出现:

s = s.replace(/^(?:(?!ABCD).)*((?:ABCD)?).*$/, '$1');
这迫使它尝试在每个位置捕捉
ABCD
。(这也大大降低了速度——在本例中这不是一个问题,但如果在大型输入上使用此技术,则需要记住这一点。)

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


原始答案:

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

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

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

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

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

或:


输出:
ABCDABCD

如果没有正则表达式,您的问题可能会得到更好的解决。你到底想做什么?试图从一些非特定字符串的文本中删除所有内容。查询:如果
myStr=“ABCA ABCB ABC ABC ABC ABC ABC ABC ABC ABC”
,是否应返回
abcdcdabc
,我想我想做的恰恰相反。@Brentostrine bazmegakapa的回答正是这样。我可能做错了什么,但这似乎也符合
ABCD
。诚然,@bažmegakapa的解决方案更好,最终在我的代码中,使用
.match()
比他的答案更简单,但我本可以想出一百种其他方法来解决我最初的问题。这个问题是关于正则表达式的!我希望我能把“答案”分成两半,但我两个都投了赞成票。回答得好,但我真的在寻找一种方法来处理正则表达式。@brentonstrine好吧,我用了正则表达式:)我觉得你没有回答我关于正则表达式的问题的精神,但我最终在我的实际代码中使用了
.match()
,谢谢+1.@brentonstrine IMO经典正则表达式不是解决此问题的最佳工具,这就是我试图提供替代方法的原因。当然,还有一千种其他方法,甚至根本不使用正则表达式。如果你认为答案足够好,请接受,这样每个人都可以看到问题已经解决。当然,如果你接受艾伦的回答也没问题,这是一个很好的回答。哎呀,我还以为我接受了他的回答呢。我希望我能同时接受阿兰和你的。那似乎一点也不匹配。我用sed测试了它。如果你用别的东西来测试它,那么也许你需要插入一些反斜杠或者一些小的改变。你最终成功地使它适应你的需要了吗?我用shell脚本测试了它,而不是javascript。
var myStr = "ABCA ABCB ABCD BCD ABC";
var foo = myStr.replace(/\b(?!ABCD\b)\w+\b/g,'').trim(); // returns ABCD
document.write(foo);
var myStr = "ABCA ABCB ABCD BCD ABCD ABC";
var foo = myStr.replace(/\b(?!ABCD\b)\w+\b/g,'').replace(/\s/g, '');
document.write(foo);