2017-06-04 107 views
2

這是用於JavaScript的。正則表達式從一個通用的正則表達式獲取多個捕獲組

我的問題:

所以我想一個正則表達式,可以得到多個子組捕獲的字符串。現在我的嘗試只獲得一個,而我期望3.理想情況下,它應該是多樣的,它應該能夠獲得2或3或更多。

我嘗試

let characters = { 
 
    some: { 
 
    test: { 
 
     var: "hi" 
 
    } 
 
    } 
 
} 
 

 
let b = document.getElementById("body"); 
 
let h = b.innerHTML; 
 
let regex = /(?:\$\{)([^.]*[.]?)*(?:\})/; 
 
let match; 
 
match = regex.exec(h); 
 

 
console.log(match);
<div id="body"> 
 
    ${some.test.var} 
 
</div>

我想要什麼

let characters = { 
 
     some: { 
 
     test: { 
 
      var: "hi" 
 
     } 
 
     } 
 
    } 
 

 
let b = document.getElementById("body"); 
 
let h = b.innerHTML; 
 
let regex = /(?:\$\{)([^.]*)[.]([^.]*)[.]([^.]*)(?:\})/; 
 
let match; 
 
match = regex.exec(h); 
 

 
console.log(match);
<div id="body"> 
 
    ${some.test.var} 
 
</div>

+2

你想匹配什麼?預期的結果是什麼? – guest271314

+0

@ guest271314'$ {'和'}'之間的東西除了點之外的所有東西,所以檢查第二個代碼片段,看看它和第一個代碼片段的區別 –

+0

因此,如果你有'$ {some.test.var.more }'你需要''''''測試','var'和'more'? –

回答

0

看來你想使用一個單個的捕獲組獲得多個組在得到的數組中。 JavaScript正則表達式不可能。見Repeating a Capturing Group vs. Capturing a Repeated Group。結果數組中總是會有與捕獲組中模式(+1,包含整個匹配的第零組)相同的組。如果你使用(\w*)*它將匹配0個字符,然後匹配一個空格並將其放入組1緩衝區,然後,如果它發現另一個字符字符和空格,正則表達式引擎將匹配此文本部分,替換內部的內容第1組,並且將繼續搜索等

您需要首先匹配${...}子(可能有多種選擇這裏,順便說一句,我建議/\${(\w+(?:\.\w+)*)}/g只匹配${...}有內字字符和.,卻能也有/\${([^}]+)}/g),然後用.分裂:

const regex = /\${(\w+(?:\.\w+)*)}/g; 
 
const str = `\${some.test.var} \${some.test.var.more.here}`; 
 
let m; 
 

 
while (m = regex.exec(str)) { 
 
    console.log(m[1].split('.')); 
 
}

請注意您在m[0]有完整匹配值。

圖案的詳細資料

  • \${ - 一${文字串
  • (\w+(?:\.\w+)*) - 第1組捕獲:
    • \w+ - 1或多個單詞字符
    • (?:\.\w+)* - 零個或多個序列:
      • \. - 點
      • \w+ - 1個或多個單詞字符
  • } - 字面}

如果你想簡化模式,使用/\${([.\w]+)}/g/\${([^}]+)}/g

+0

啊,當然,我應該剛剛使用拆分。我會仔細檢查一下,然後可能會接受。 –

+0

只是爲了好奇,有沒有辦法不使用拆分,以便通用捕獲組可以輸出相同的多個捕獲組?或者就在正則表達式之上?例如。 '(\ w *)*'會返回與(\ w)*(\ w)*'相同的值。我認爲全球變量將解決它。 –

+0

請參閱[重複捕獲組與捕獲重複組](http://www.regular-expressions.info/captureall.html)。結果數組中總是會有與捕獲組中模式(+1,包含整個匹配的第零組)相同的組。如果使用'(\ w *)*',它將匹配0個字符,然後匹配一個空格,並將它放入組1緩衝區,如果發現另一個字符串和一個空格,則正則表達式引擎將匹配文本部分,替換組1內的內容,並繼續搜索等。 –