2012-08-09 120 views
3

如何编写一个匹配除给定字符串(“ABCD”)以外的所有内容的Javascript正则表达式?正则表达式匹配任何不是字符串“ABCD”的东西

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

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

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

如果没有正则表达式,可能会更好地解决您的问题。你究竟在做什么? – 2012-08-09 22:46:01

+0

尝试从一些不是特定字符串的文本中去除所有内容。 – brentonstrine 2012-08-09 22:47:56

+0

尝试这样的:\ bABCD \ b – godspeedlee 2012-08-09 22:50:08

回答

3

好的,我错误地解释了这个问题。看起来你想测试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]+$/ 
+0

我可能做错了,但是这似乎也符合'ABCD'。 http://www.myregextester.com/?r=c725cba3 – brentonstrine 2012-08-09 23:08:16

+0

不,我没有真正读过这个问题。现在就试试。 – 2012-08-10 00:25:47

+0

真,@bažmegakapa的解决方案是更好的,最终在我的代码,使用'.match()'结束了比他的回答,我的目的就更简单了,但我可以拿出一百其他方式来解决我最初的问题。这个问题是关于正则表达式的!我希望我可以分解“答案”,但我确实赞成了两个。 – brentonstrine 2012-08-10 04:38:12

5

你可以简单地检查ABCD,检查有多少它在字符串中存在的,然后从中构建一个新的字符串是这样的(你可以使用空间如果它适合你的情况下更好地分隔符):

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

三元是有,因为match()将返回null如果发现什么 - 这不具有join()方法。

+0

很好的答案,但我真的很想用正则表达式来做这件事。 – brentonstrine 2012-08-09 23:11:53

+1

@brentonstrine好吧,我用正则表达式:) – kapa 2012-08-09 23:13:52

+0

我觉得你没有回答我的正则表达式的有关问题的精神,但我没有最终使用'.match()'在我实际的代码,这样的感谢。 +1。 – brentonstrine 2012-08-10 04:39:35

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:~$ 
+0

这似乎不匹配任何东西。 http://www.myregextester.com/?r=3ece4a12 – brentonstrine 2012-08-10 00:25:07

+0

我用sed测试过它。如果你用别的东西来测试它,那么也许你需要插入一些反斜杠或一些小的变化。 – alinsoar 2012-08-10 11:14:17

+0

你是否管理,最后,以适应你的需要?我在shell脚本中测试它,而不是在javascript中。 – alinsoar 2012-08-11 09:34:36

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

相关问题