2013-06-12 23 views
0

方括號我想分析類似這樣使用JavaScript的模式:正則表達式匹配@後面包含了一些

@[10] or @[15] 

隨着我的努力,我想出了這個:

@\\[(.*?)\\] 

這種模式工作正常,但問題是它匹配任何黑白方括號。我希望它只匹配數字。我想這太:

@\\[(0-9)+\\] 

@\\[([(0-9)+])\\] 

但這些比賽沒什麼。

此外,我只想匹配完整的單詞而不是字符串中單詞的一部分的模式。即如果它沒有開始或結束腳本,則應該包含空格兩側。這意味着它不應該匹配這樣的短語:

[email protected][13]fsfs 

在此先感謝。

+0

你爲什麼要加倍反斜槓?加倍後,它們就像'@ \ +)\]'匹配,除非你的圖案在字符串中。 – cHao

+0

單斜槓似乎沒有工作。加倍在一定程度上正常工作。我非常新的這個東西.. – Sourabh

+0

'@ \ [[0-9] * \]'例子:http://regexr.com?3572f如果可能的話,你可以給我們一些您的JavaScript代碼? @cHao是正確的,'\\'是一個轉義的''。 *注意* StackOverflow也會轉義。最後添加了一個空格以獲得更簡單的結果。 –

回答

1

使用正則表達式:

/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g 

它將匹配,如果方式(@[number])不是一個單詞的一部分。如果它沒有開始或結束字符串,應該包含空格雙方。

它使用羣體,因此,如果需要的數字,使用組1

Testing code (click here for demo):

console.log(/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g.test("@[10]")); // true 
console.log(/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g.test("@[15]")); // true 
console.log(/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g.test("[email protected][13]fsfs")); // false 
console.log(/(?:^|\s)@\[([0-9]+)\](?=$|\s)/g.test("abxdcs @[13] fsfs")); // true 

var r1 = /(?:^|\s)@\[([0-9]+)\](?=$|\s)/g 
var match = r1.exec("@[10]"); 
console.log(match[1]); // 10 

var r2 = /(?:^|\s)@\[([0-9]+)\](?=$|\s)/g 
var match2 = r2.exec("abxdcs @[13] fsfs"); 
console.log(match2[1]); // 13 

var r3 = /(?:^|\s)@\[([0-9]+)\](?=$|\s)/g 
var match3; 
while (match3 = r3.exec("@[111] @[222]")) { 
    console.log(match3[1]); 
} 
// while's output: 
// 111 
// 222 
+0

這應該工作,只要你不需要捕獲數字。 –

+0

實際上,我並不是指由字符串開頭或結尾的模式。我的意思是這種模式不應該是單詞的一部分。如果它沒有開始或結束字符串,應該包含空格雙方。 – Sourabh

+0

@Sourabh現在更新了測試代碼。 – acdcjunior

0

你不需要的字符類中這麼多字。更重要的是,你把+放在錯誤的地方。試試這個:@\\[([0-9]+)\\]

0

你接近,但你需要使用方括號:

@\[[0-9]+\] 

或者更短的版本:

@\[\d+\] 

你需要那些斜線的原因是爲了「逃避」的方括號。通常它們用於表示「character class」。

[0-9]創建一個與0到9範圍內的一個數字完全匹配的字符類。添加+將含義更改爲「一個或多個」。 \d只是[0-9]的簡寫。

當然,反斜槓字符也用於轉義字符串內的字符串,這就是爲什麼你必須轉義它們。所以:

的JavaScript

"@\\[\\d+\\]" 

變爲:

正則表達式

@\[\d+\] 

這是用來匹配:

@字符 「@」 符號
\[文字 「[」 符號
\d+一個或多個數字(幾乎相同[0-9]+
\]文字 「]」 符號

我說\d幾乎相同[0-9],因爲在一些正則表達式的口味(including .NET),\d實際上除了0-9匹配來自其他文化的數字。