2012-04-30 84 views
4

我的web應用程序需要解析由括號括起來的字符串中的數字範圍。我從來沒有真正理解正則表達式,所以我需要一些幫助。下面的代碼是我想要做的(我會然後拆分連字符的字符串,並獲取最小值/最大值)。顯然這種模式是錯誤的 - 下面的例子警告「(10-12)foo(5-10)酒吧」,當我期望的結果是1警報說(10-12)和下一個說法(5-10),或更好如果可能的話,那些沒有括號的值。正則表達式/ Javascript在括號中的匹配值

任何幫助表示讚賞。

var string = "foo bar (10-12) foo (5-10) bar"; 
var pattern = /\(.+\)/gi; 
matches = string.match(pattern); 

for (var i in matches) { 
    alert(matches[i]); 
} 
+0

開始學習正則表達式,這是值得的。這是一個很好的cheatsheet http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ – mreq

回答

7

讓你的懶惰量詞由+後加入?。否則,它會盡可能地貪婪地消耗,從開始的(到最後的)在字符串中。

var string = "foo bar (10-12) foo (5-10) bar", 
    pattern = /\(.+?\)/g, 
    matches = string.match(pattern); 

jsFiddle

如果您不想在括號中包括括號,通常您會使用正向前視和向後看括號。 JavaScript不支持向後看(雖然你可以他們)。所以,使用...

var string = "foo bar (10-12) foo (5-10) bar", 
    pattern = /\((.+?)\)/g, 
    match, 
    matches = []; 

while (match = pattern.exec(string)) { 
    matches.push(match[1]); 
} 

jsFiddle

也...

  • 你不需要在你的正則表達式的i標誌;你不匹配任何字母。
  • 您應該始終將變量的範圍設爲var。在你的例子中,matches將是全球性的。您不應該使用for (in)來遍歷數組。您還應該檢查match()不返回null(如果未找到結果)。
+0

優秀 - 有沒有辦法去除比賽的括號,或者更好地處理正則表達式? – user949738

+0

@ user949738當然,看我的答案我要寫的部分:) – alex

+1

@ user949738:'string.match(/\(.+?\)/ g).join('')。match(/ \ d + \ - \ d +/g)' – KooiInc

3

的問題是,你的正則表達式貪婪,這意味着它會匹配第一個托架,並繼續下去,直到找到最後的支架。要解決此問題,您有兩個選項,您可以在+之後添加?以使其不是貪婪:\(.+?\)或者匹配除結束括號之外的任何字符:\([^)]+\)

這兩個正則表達式都應該做你所需要的。

+1

+1'[^]] +'也很方便。 – alex

+0

該解決方案更好。 –

相關問題