此问题已在此处有答案:
RegEx to extract all matches from string using RegExp.exec(19回答)
上个月关门了。
我正在编写一些代码,可以从一个文本块中提取所有链接。我有一个正则表达式模式,我只是想知道是否有一种方法可以得到所有匹配的正则表达式模式?
我尝试了一些代码,但每次都没有返回任何东西。
任何答案都很感激。
let string = "Hello world"
let m, newtext, re = /o/g
do {
m = re.exec(string);
if (m) {
newtext = (m[1], m[2]);
}
} while (m);
console.log(m,newtext)
这不是一个重复的职位没有解决我的问题。
我也用了这个代码,但我得到一个错误:“findAll不是函数或其返回值不可迭代”
function link() {
const findAll = (value, expr) => {
const iterator = value.matchAll(typeof expr === 'string' ?
new RegExp(expr, 'gd') :
new RegExp(expr.source, [...new Set((expr.flags + 'gd').split(''))].join('')));
let _next;
[_next, iterator.next] = [iterator.next, function(){
const result = _next.call(iterator);
if(!result.done){
const {0: text, indices: [[startIndex, endIndex]]} = result.value;
console.log(
'done:', false,
'value:', {text, startIndex, endIndex}
);
}
console.log (result);
}];
console.log(iterator);
}
console.log('matching with string:');
for (const m of findAll(str, re)) {
console.log(JSON.stringify(m));
}
console.log('matching with regex:');
for (const m of findAll(str, re)) {
console.log(JSON.stringify(m));
}
}
3条答案
按热度按时间pn9klfpd1#
跳上马车,这里是一个修改版本的先生。Polywhirl的回应:
1.返回
.matchAll
的迭代器,这样我们就可以使用迭代器的所有优点,例如,我们可以中断循环,从而跳过其余部分并优化性能。.next()
以获得我们需要的格式的数据。1.将
d
标志添加到正则表达式中,以便我们可以自动获取开始和结束匹配索引1.通过添加
gd
标志来修复第二个参数(如果是regexp)pzfprimi2#
正如@Konrad所说。最好的方法之一是使用
matchAll
。范例:1qczuiv03#
以下是Jivopis回应的修改版本。
我创建了一个名为
findAll
的函数,它接受一个字符串和一个模式(字符串或正则表达式),并返回一个对象列表。这些对象包含原始文本中每个匹配子字符串的text
、startIndex
和endIndex
。输出