正则表达式在正则表达式测试器中工作但不在JS中(错误匹配)

时间:2016-09-26 08:47:38

标签: javascript regex

这实际上是我第一次遇到这个问题。 我正在尝试解析一个字符串,用于键值对,其中分隔符可以是不同的字符。它适用于任何正则表达式测试程序,但不适用于我当前的JS项目。我已经发现,JS正则表达式的工作方式不同,例如php。但我无法找到与我有关的内容。

我的正则表达式如下:

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

它应匹配:

#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"]

对我来说,看起来分组工作不正常。 有办法解决这个问题吗?

2 个答案:

答案 0 :(得分: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 :(得分: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
    }
}