2011-12-20 81 views
2

可能是一個簡單的問題,但我創建正則表達式的知識有點含糊。RegExp匹配除兩個保留字符串之外的任何字符串嗎?

我想匹配任何字符串,後跟一個逗號和除非它是「拜爾雜亂」或空間「液體加熱器」

這裏是我迄今爲止

var re_comma = new RegExp("\w+[^Bair Hugger|Fluid Warmer]" + ", ", "i"); 

有任何想法嗎?

+0

你的意思是','後面的句子或整個字符串的結尾? – Termi 2011-12-20 10:02:46

+0

什麼是Bair Hugger? – 2011-12-20 10:10:02

+0

@Termi字符串和它後面的逗號和空格。但之後什麼也沒有。希望更清楚 – 2011-12-20 10:10:13

回答

6

新的答案

關於你提到的例子中,我會說這是真的容易了它分割字符串和迭代:

function filter(str, delim, test) { 
    var parts = str.split(delim), 
     result = []; 

    for(var i = 0, len = parts.length; i < len; i++) { 
     if(test(parts[i])) result.push(parts[i]); 
    } 

    return result.join(delim); 
} 

str = filter(str, ', ', function(s) { 
    s = s.toLowerCase(); 
    return s === 'bair hugger' || s === 'fluid warmer'; 
}); 

否則,你的表情變得像這樣:

new RegExp("(^|,)(?!(?:Bair Hugger|Fluid Warmer)(?:$|,)).+?(, |$)", "i"); 

並且您必須使用回調進行替換以決定是否刪除前面的,或尾隨,與否:

str = str.replace(re_comma, function(str, pre, tail) { 
    return pre && tail ? tail : '';// middle of the string, leave one 
}); 

該代碼的意圖是不太清楚。也許有一個更簡單的表達式,但我認爲過濾數組仍然更清潔。


老答案:(不手頭解決問題,但對於正則表達式提供的信息)。

[]表示字符類,只會匹配一個的性格,你所提供的那些的。 [^Bair Hugger|Fluid Warmer][^Bair Huge|FldWm]相同。

你可以使用負前瞻:

new RegExp("^(?!(Bair Hugger|Fluid Warmer),).+?, $", "i"); 

請注意,你必須使用\\字符串中產生一個\。否則,"\w"將變成w,並且不再是特殊字符序列。您還必須錨定表達式。

更新:正如你所說,你要匹配的逗號之前的任何字符串,我決定用.而不是\w,匹配任何字符。

+0

你的意思是'(?!'而不是'(?!='? – Howard 2011-12-20 10:04:37

+0

@霍華德:謝謝! – 2011-12-20 10:05:26

+0

這也排除了那些只是從一個「禁止的詞」開始(比如'Bair Hugger Refill,')。 – 2011-12-20 10:11:57

0

我愛正則表達式和Felix Kling的答案是正確的:)

然而,對於這樣的簡單匹配我通常會使用類似下面

function contains(str, text) { 
    return str.indexOf(text) >= 0; 
} 

if(contains(myString, 'random')) { 
    //myString contains "random" 
} 
+0

謝謝,對未來有用,但我不能用它來實現我的目標。 – 2011-12-20 10:22:18

0

解決方案:

reg =/(?:Bair Hugger|Fluid Warmer),| (.*)/ 
    str='Bair Hugger, lalala' 
    reg.exec(str) 
    >> ["Bair Hugger, lalala", " lalala"] 
    newStr = reg.exec(str)[1] 
+0

你會如何使用它從''毯子,液體加溫器,Bair Hugger''去掉'毯子'? – 2011-12-20 11:00:43

相關問題