2016-09-06 66 views
3

我試圖從文本中僅提取密鑰字符串部分「ProcessName」和「ProcessID」。 文本可以有更多的關鍵。 (爲了簡單起見,我只是使用帶有兩個鍵的文本) 是否有可能捕獲組的多次出現?如何使用捕獲括號捕獲多個事件

var text = "[ProcessName] - [ProcessID]"; 
var regex = new RegExp(/\[[(A-Za-z0-9)]+\]/g); 
var result = regex.exec(text); 
console.log(result); 

當我使用exec時,它給了我一個匹配和括號,所以它似乎沒有用處。 enter image description here

也試過匹配(),但它包含方括號。嘗試了很多次,但似乎無法做到。

var result = text.match(regex); 

enter image description here

+0

你知道你的模式匹配的是什麼? '\ [[(A-Za-z0-9)] + \]'匹配'['後跟1個或多個'(',字母,數字,')',然後匹配尾部的'​​]。這裏沒有捕獲組。你真的想匹配什麼? '[...]'裏面的字母數字?在循環中使用'/ \ [([a-z0-9] +)]/ig'和'RegExp#exec'。訪問匹配[1]值。 –

+0

這可能是最好的,如果你可以運行'console.log(JSON.stringify(result))'幷包含結果文本,而不是發佈結果圖像... –

回答

2

您錯位的圓形和方形支架,從而爲創建角色職業防止個子匹配的捕獲組的一部分。

您需要交換托架的位置:

/\[([a-z0-9]+)]/gi 

regex demo和下方的JS演示。

圖案的詳細資料

  • \[ - 字面[
  • ([a-z0-9]+) - 第1組捕獲的一個或多個字母數字
  • ] - 字面閉括號(無需逸出它時,它是外側一個字符類)
  • /gi - 全局和不區分大小寫的匹配修飾符([a-z]也將匹配A-Z,處理每個非重疊匹配)

var re = /\[([a-z0-9]+)]/gi; 
 
var str = '[ProcessName] - [ProcessID]'; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    res.push(m[1]); 
 
} 
 
console.log(res);

在代碼中,我們需要使用RegExp#exec而非String#match,因爲後者與具有正則表達式中使用時全局修改器將放棄所有子匹配(捕獲的部分)(請參閱Description at MDN String#match頁)。

+0

請注意,如果您需要使用一個沒有全局標誌的正則表達式(只匹配「RegExp#exec」和'/ \ [([a-z0-9] +)]/gi' regex,一次出現),那麼就使用'String#match'。 –

+0

感謝您提供豐富的答案。 –

1

不久之後我提出一個問題,我找到了答案......

var regex = new RegExp(/\[([A-Za-z0-9]+)\]/g); 
var matches, output = []; 
while (matches = regex.exec(text)) 
{ 
    output.push(matches[1]); 
}