2011-08-15 106 views
0

我得括號的子串的數目在一個正則表達式匹配括號的子模式的數量:JavaScript和正則表達式:獲得

var reg=/([A-Z]+?)(?:[a-z]*)(?:\([1-3]|[7-9]\))*([1-9]+)/g, 
nbr=0; 

//Some code 

alert(nbr); //2 

在上述示例中,總的爲2:只有第一和最後一對括號將創建分組匹配。

如何知道這個數字的任何正則表達式?

我的第一個想法是要檢查正則表達式的值。$ 1正則表達式。$ 9,但即使沒有相應的parenthseses,這些值不爲空,但空字符串...

我也已經看到RegExp.lastMatch屬性,但是這個只表示最後匹配的字符的值,而不是相應的數字。

所以,我試圖建立另一個正則表達式掃描任何正則表達式和統計這個數字,但它是相當困難...

你有一個更好的解決辦法來做到這一點?

在此先感謝!

+0

如果你能提供一個有問題的輸入樣本和預期的數量以確保我們的想法正確,那將會很好。 – Sheepy

+0

我開發的工具(語法高亮器)將允許用戶定義他們自己的正則表達式,以便按照他們的想法設計其代碼。例如: /(<\ /?h [1-6])(?:?)(\ /?>)/ g 將匹配HTML頁面的標題標籤。這裏,預期的數字是兩個:用戶定義了三對括號,但其中一個是非捕獲的! 我希望它更清楚。 – KorHosik

回答

1

那麼從代碼片段,我們可以假設輸入模式始終是一個有效的正則表達式來判斷,因爲否則會在一些代碼partm權利之前失敗?這使得任務變得更容易!

因爲我們只需要計算有多少個開始捕獲括號!

var reg = /([A-Z]+?)(?:[a-z]*)(?:\([1-3]|[7-9]\))*([1-9]+)/g; 

var nbr = (' '+reg.source).match(/[^\\](\\\\)*(?=\([^?])/g); 
nbr = nbr ? nbr.length : 0; 

alert(nbr); // 2 

這裏是一個細分:

  • [^\\]確保我們不逸出斜線開始比賽。
  • (\\\\)*而且我們可以在開始的小括號之前有任意數量的斜線斜線。
  • (?=展望未來。稍後再說。
    • \(我們正在尋找的起始小括號。
    • [^?]確保它沒有跟着一個問號 - 這意味着它正在捕獲。
  • )結束的樣子提前

爲什麼配以超前的外觀?爲了檢查小括號不是轉義實體,我們需要捕捉它前面的內容。這裏沒什麼大不了的。我們知道JS沒有看到後面。

問題是,如果有兩個起始括號粘在一起,那麼一旦我們捕獲了第一個括號,第二個括號就沒有任何支持 - 它的後面已經被捕獲了! 所以爲了確保一個小圓圈可以成爲下一個小圓圈的起始基礎,我們需要將它從匹配中排除。

並添加到源的空間?如果它是一個起始的小括號,那麼它就是第一個字符的後面。

+0

呃,非常感謝你,這完全是我在找的! – KorHosik

2

Javascripts RegExp .match() method returns a Array of matches。您可能只想檢查結果數組的長度。

var mystr = "Hello 42 world. This 11 is a string 105 with some 2 numbers 55"; 
var res = mystr.match(/\d+/g); 

console.log(res.length); 
+0

謝謝你的回答!但是,這個解決方案需要建立另一個正則表達式來匹配想要的圓括號(我們怎麼說英文?捕獲圓括號?括號括起來的子模式?),我不知道如何編寫這個RegExp。 – KorHosik