如何编写一个匹配除给定字符串(“ABCD”)以外的所有内容的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
的存在,如果你发现它,用下面的代码替换整个字符串:ABCD
。这将做到这一点:
s = s.replace(/.*(ABCD).*/, '$1');
却会留下未变化的字符串,如果有在它没有ABCD
。如果你想在这种情况下删除字符串,你必须使捕获可选。但你必须改变正则表达式的第一部分就捕获它“偷袭”:
s = s.replace(/^(?:(?!ABCD).)*((?:ABCD)?).*$/, '$1');
这迫使它尝试在每个位置捕获ABCD
。 (它也会大幅减慢速度 - 在这种情况下不是问题,但是如果您在大量输入中使用此技术,请记住一些事项。)
所以纯粹的正则表达式解决方案确实存在,但我喜欢@bažmegakapa's解决方案更好:d
原来的答案:
/^(?!ABCD$).*/
注意,这也将匹配一个空字符串。如果您有任何积极的要求,您可以将.*
更改为任何您需要的。例如,匹配一个或多个大写ASCII字母,但不完全匹配的字符串ABCD
,你可以使用:
/^(?!ABCD$)[A-Z]+$/
我可能做错了,但是这似乎也符合'ABCD'。 http://www.myregextester.com/?r=c725cba3 – brentonstrine 2012-08-09 23:08:16
不,我没有真正读过这个问题。现在就试试。 – 2012-08-10 00:25:47
真,@bažmegakapa的解决方案是更好的,最终在我的代码,使用'.match()'结束了比他的回答,我的目的就更简单了,但我可以拿出一百其他方式来解决我最初的问题。这个问题是关于正则表达式的!我希望我可以分解“答案”,但我确实赞成了两个。 – brentonstrine 2012-08-10 04:38:12
你可以简单地检查ABCD
,检查有多少它在字符串中存在的,然后从中构建一个新的字符串是这样的(你可以使用空间如果它适合你的情况下更好地分隔符):
var res = myStr.match(/ABCD/g);
var str = res ? res.join('') : '';
三元是有,因为match()
将返回null
如果发现什么 - 这不具有join()
方法。
很好的答案,但我真的很想用正则表达式来做这件事。 – brentonstrine 2012-08-09 23:11:53
@brentonstrine好吧,我用正则表达式:) – kapa 2012-08-09 23:13:52
我觉得你没有回答我的正则表达式的有关问题的精神,但我没有最终使用'.match()'在我实际的代码,这样的感谢。 +1。 – brentonstrine 2012-08-10 04:39:35
这是否定的直接扩展,而无需使用否定运算符:
/^\([^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:~$
这似乎不匹配任何东西。 http://www.myregextester.com/?r=3ece4a12 – brentonstrine 2012-08-10 00:25:07
我用sed测试过它。如果你用别的东西来测试它,那么也许你需要插入一些反斜杠或一些小的变化。 – alinsoar 2012-08-10 11:14:17
你是否管理,最后,以适应你的需要?我在shell脚本中测试它,而不是在javascript中。 – alinsoar 2012-08-11 09:34:36
尝试这样的:
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
如果没有正则表达式,可能会更好地解决您的问题。你究竟在做什么? – 2012-08-09 22:46:01
尝试从一些不是特定字符串的文本中去除所有内容。 – brentonstrine 2012-08-09 22:47:56
尝试这样的:\ bABCD \ b – godspeedlee 2012-08-09 22:50:08