2012-03-07 74 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