Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 执行regex exec,同时将所有变量保留在块范围内_Javascript_Regex_Ecmascript 6 - Fatal编程技术网

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非全局正则表达式的Afaik
match
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非全局正则表达式的Afaik
match
exec
是相同的,只是在另一端有方法。使用全局正则表达式调用时,它们会有所不同-
match
返回所有匹配项的数组,
exec
仅返回下一个匹配项。