2012-08-09 47 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

相關問題