2011-12-20 59 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

相关问题