2012-03-07 37 views
2

我是RegExp的新手。这是我的问题。我有一个输入值。我将RegExp“规则”应用于该输入值。规则从输入值开始,不区分大小写。让我们举个例子。我的参考字符串是Paris (75018),我的输入值是Pari。在这种情况下一切工作正常。但是,如果输入值是Paris (7它不起作用。在那种情况下,“系统”告诉我没有匹配,我不明白。它是匹配!希望有人能帮忙。预先感谢您的回复。干杯。马克。jQuery - RegEx工作奇怪

http://jsfiddle.net/JU8Va/

我的HTML:

<input id="btn" type="submit" />​ 

我的JS:

$('#btn').click(function() { 
    var loc = "Paris"; //input value... 
    var locRegExp = new RegExp("^" + loc, "i"); // 

    var test = "Paris (75018)"; //reference value 

    if (test.match(locRegExp)) { 
     alert('matches'); 
     } 
     else { 
      alert('does not match'); 
     } 
    });​ 

回答

3

的问题是(在正则表达式有特殊的意义。为了从字面上理解,你必须将其转义为\(。在这里看到:http://jsfiddle.net/JU8Va/1/

var loc = "Paris \\(7"; 
var locRegExp = new RegExp("^" + loc, "i"); 

注意,有一个双反斜线;这是因为反斜杠本身在字面引用的字符串中有特殊的含义,所以你必须避开反斜杠才能从正则表达式中得到它。

还要注意的是对文字(不带引号)的正则表达式,你不需要转义反斜线,只是括号。例如:test.match(/Paris \(7/)

在正则表达式中,未转义的(表示“启动捕获组”。捕获组是运行它之后检索匹配数据的方式。在这里看到有关如何将这些工作答案:http://www.regular-expressions.info/brackets.html

如果你不提前知道什么时间loc将包含,你可以逃脱的版本替换括号中的所有实例,像这样:

var locRegExp = new RegExp("^" + loc.replace(/\(/g, "\\(").replace(/\)/g, "\\)"), "i"); 

但请注意,除了括号外,还有许多特殊字符可能需要测试。如果你发现自己替换了很多角色,也许可以考虑尝试一种不同的方法。例如,你只是在寻找一个从测试字符串开头开始的不区分大小写的搜索?为此,你不需要正则表达式,你可以做一个子串搜索:

test.toLowerCase().indexOf(loc.toLowerCase()) === 0 
+1

您好奔由于需要时间来帮我是否可以适用的规则与。正则表达式或以编程方式执行它? – Marc 2012-03-07 16:37:56

+0

@Marc,我不明白你的意思是一个“规则”。 – 2012-03-07 16:41:01

+0

我的意思是有可能自动添加斜线? – Marc 2012-03-07 16:42:52

1

你将不得不逃避正则表达式使用的特殊字符。在你的例子中(就是那个角色。 。

1

这是因为“(”是一个特殊字符,应逃脱越狱的模式应该是:

Paris \(7