Javascript 执行regex exec,同时将所有变量保留在块范围内
我试图找到一种最短、最容易阅读、不重复的方法来执行循环全局Javascript 执行regex exec,同时将所有变量保留在块范围内,javascript,regex,ecmascript-6,Javascript,Regex,Ecmascript 6,我试图找到一种最短、最容易阅读、不重复的方法来执行循环全局exec,同时将所有变量保持在块范围内 我在顶级作用域中有一个字符串: const str = 'AaAa'; 我现在不想再污染这个顶级了,我想要一个简短的sweet循环来迭代所有的匹配 我现在这样做: const patt = /a/ig; let match; while (match = patt.exec(str)) { console.log(match); } 然而,这将match和patt放入顶级范围(假设我不将其
exec
,同时将所有变量保持在块范围内
我在顶级作用域中有一个字符串:
const str = 'AaAa';
我现在不想再污染这个顶级了,我想要一个简短的sweet循环来迭代所有的匹配
我现在这样做:
const patt = /a/ig;
let match;
while (match = patt.exec(str)) {
console.log(match);
}
然而,这将match和patt放入顶级范围(假设我不将其包装在块中)
这是可行的,但我必须在的初始化部分和的重复部分重复的match=patt.exec(str):
for (let patt = /a/ig, match=patt.exec(str); match; match=patt.exec(str)) {
console.log('match:', match);
}
在不重复match=patt.exec(str)
的情况下,最后一种方法如何做到这一点?(理想情况下,patt
应该是const-patt
而不是let-patt
,因为它有助于更容易阅读)
理想情况下,类似于以下损坏的伪代码:
for (const patt = /a/ig, let match=patt.exec(str); match;) {
console.log('match:', match);
}
你就写吧
{
const patt = /a/ig;
for (let match; match=patt.exec(str); ) {
console.log('match:', match);
}
}
不能将let
与const
语句组合在for
循环头中
您可能想省去周围的块,将常量patt
放在与您刚刚编写的常量str
相同的范围内应该没有什么问题
{
const patt = /a/ig;
for (let match; match=patt.exec(str); ) {
console.log('match:', match);
}
}
不能将let
与const
语句组合在for
循环头中
您可能想省去周围的块,从可读性的角度来看,
const-patt
与const-str
在同一范围内应该没有问题,闭包怎么样?谢谢@gurvinder372-这是个好主意。从可读性的角度来看,闭包怎么样?谢谢@gurvinder372-这是个好主意。或者:for(让patt=/a/ig,match;match=patt.exec(str);{console.log(match);}
。非常好!谢谢你Bergi,我喜欢@T.J.Crowder方法。我在想有人会用生成器/迭代器说些什么。哈哈@TJCrowder我在被删除的帖子中看到了你有趣的评论:哇,我只是把patt
放在与str
相同的范围内进行测试。我犹豫了一下,因为我有一个g
标志,所以它总是记得lastIndex
。但似乎在循环完成后,lastIndex
将重置为0。为什么会这样?lastIndex
在第一次未找到后是否重置?我不知道这种重置行为,这使得现在在全局空间中g
patt's完全可以@Noitidart哦,您当然可以编写一个生成器,它可以被调用为(所有匹配的常量匹配(/a/ig))…或something@Noitidart非全局正则表达式的Afaikmatch
和exec
是相同的,只是在另一端有方法。使用全局正则表达式调用时,它们会有所不同-match
返回所有匹配项的数组,exec
只是下一个匹配项。或者:for(让patt=/a/ig,match;match=patt.exec(str);{console.log(match);}
。非常好!谢谢你Bergi,我喜欢@T.J.Crowder方法。我在想有人会用生成器/迭代器说些什么。哈哈@TJCrowder我在被删除的帖子中看到了你有趣的评论:哇,我只是把patt
放在与str
相同的范围内进行测试。我犹豫了一下,因为我有一个g
标志,所以它总是记得lastIndex
。但似乎在循环完成后,lastIndex
将重置为0。为什么会这样?lastIndex
在第一次未找到后是否重置?我不知道这种重置行为,这使得现在在全局空间中g
patt's完全可以@Noitidart哦,您当然可以编写一个生成器,它可以被调用为(所有匹配的常量匹配(/a/ig))…或something@Noitidart非全局正则表达式的Afaikmatch
和exec
是相同的,只是在另一端有方法。使用全局正则表达式调用时,它们会有所不同-match
返回所有匹配项的数组,exec
仅返回下一个匹配项。