我希望我能在这里清楚地解释一下,这不是一个特定的问题。
我正在研究一些需要获取字符串的javascript,在方括号之间查找字符实例,存储任何返回的结果,然后从原始字符串中删除它们。
到目前为止我的代码如下:
parseLine : function(raw)
{
var arr = [];
var regex = /\[(.*?)]/g;
var arr;
while((arr = regex.exec(raw)) !== null)
{
console.log(" ", arr);
arr.push(arr[1]);
raw = raw.replace(/\[(.*?)]/, "");
console.log(" ", raw);
}
return {results:arr, text:raw};
}
这似乎适用于大多数情况。如果我传入字符串[id1]It [someChar]found [a#]an [id2]excellent [aa]match
,那么它将返回方括号内的所有字符以及删除了括号内组的原始字符串。
当我使用字符串[id1]It [someChar]found [a#]a [aa]match
时会出现问题。
当只有一个字母(和空格?)跟在括号组后面并且启动缺少的组时,似乎会失败,正如您在日志中看到的那样,如果您尝试了它。如果我像[a][b]
一样背靠背使用群组,我也会感到非常恐惧。
我猜这是我的RegEx - 请求并借用各种帖子,因为我对此一无所知 - 但我没有运气修理它并且可以使用一些帮助,如果有人有任何提供。修复会很棒但不仅仅是对幕后实际情况的解释会很棒。
先谢谢所有人。
答案 0 :(得分:3)
您可以将replace方法与函数一起使用以简化代码并仅运行一次regexp:
function parseLine(raw) {
var results = [];
var parsed = raw.replace(/\[(.*?)\]/g, function(match,capture) {
results.push(capture);
return '';
});
return { results : results, text : parsed };
}
答案 1 :(得分:1)
问题是由于正则表达式lastIndex
的{{1}}属性没有重置,因为正则表达式被声明为全局。当正则表达式具有全局标志/\[(.*?)]/g;
时,g
属性lastIndex
用于标记位置以开始下一次搜索匹配的尝试,并且预期相同的字符串被送到RegExp
函数(显式地,或implicitly via RegExp.test()
for example),直到找不到更多匹配。要么是这样,要么在输入新输入之前将RegExp.exec()
重置为0.
由于您的代码在每个循环上重新分配变量lastIndex
,因此您使用了错误的raw
来尝试下一个匹配。
当您从正则表达式中删除lastIndex
标记时,问题将得到解决。或者您可以使用the solution proposed by Tibos向g
函数提供函数来进行替换并同时提取捕获组。
答案 2 :(得分:-1)
你需要逃离最后一个括号:\[(.*?)\]
。