2016-09-26 53 views
3

這實際上是我第一次遇到這個問題。 我試圖解析一個字符串的鍵值對分隔符可以是一個不同的字符。它可以在任何正則表達式測試程序中正常工作,但不在我當前的JS項目中。我已經發現,JS正則表達式工作不同,例如PHP。但我找不到要改變的東西。正則表達式工作在正則表達式測試器,但不在JS(錯誤匹配)

我的正則表達式如下:

[(\?|\&|\#|\;)]([^=]+)\=([^\&\#\;]+)

它應該符合:

#foo=bar#site=test

MATCH 1 
1. [1-4] `foo` 
2. [5-8] `bar` 
MATCH 2 
1. [9-13] `site` 
2. [14-18] `test` 

和JS是:

'#foo=bar#site=test'.match(/[(\?|\&|\#|\;)]([^=]+)\=([^\&\#\;]+)/g);

結果:

["#foo=bar", "#site=test"] 

對於我來說,它看起來像分組工作不正常。 有沒有辦法解決這個問題?

回答

3

String#match不包括捕獲組。相反,你通過regex.exec循環:

var match; 
while (match = regex.exec(str)) { 
    // Use each result 
} 

如果(像我)的條件下,分配困擾你,你可以使用一個!!,使其明確了測試:

var match; 
while (!!(match = regex.exec(str))) { 
    // Use each result 
} 

例子:

var regex = /[(\?|\&|\#|\;)]([^=]+)\=([^\&\#\;]+)/g; 
 
var str = '#foo=bar#site=test'; 
 
var match; 
 
while (!!(match = regex.exec(str))) { 
 
    console.log("result", match); 
 
}

1

我不會依賴於一個複雜的正則表達式,它可能因爲奇怪的原因而隨時失敗,而且很難閱讀,但使用簡單的函數來分割字符串:

var str = '#foo=bar#site=test' 

// split it by # and do a loop 
str.split('#').forEach(function(splitted){ 
    // split by = 
    var splitted2 = splitted.split('='); 
    if(splitted2.length === 2) { 
     // here you have 
     // splitted2[0] = foo 
     // splitted2[1] = bar 
     // and in the next iteration 
     // splitted2[0] = site 
     // splitted2[1] = test 
    } 
}