如何編寫一個匹配除給定字符串(「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