这实际上是我第一次遇到这个问题。 我正在尝试解析一个字符串,用于键值对,其中分隔符可以是不同的字符。它适用于任何正则表达式测试程序,但不适用于我当前的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"]
对我来说,看起来分组工作不正常。 有办法解决这个问题吗?
答案 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
}
}