Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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 如何循环匹配正则表达式的所有元素?_Javascript_Regex - Fatal编程技术网

Javascript 如何循环匹配正则表达式的所有元素?

Javascript 如何循环匹配正则表达式的所有元素?,javascript,regex,Javascript,Regex,情况如下: 我想找到与正则表达式匹配的元素 targetText=“SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext” 我在javascript中使用正则表达式,如下所示 reg = new RegExp(/e(.*?)e/g); var result = reg.exec(targetText); 我只得到了第一个,但没有得到第二个。。。。 我只能得到T1,但不能得到T2,T3 尝试在字符串上使用而不是exec(),不过也可以

情况如下: 我想找到与正则表达式匹配的元素

targetText=“SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext”

我在javascript中使用正则表达式,如下所示

reg = new RegExp(/e(.*?)e/g);   
var result = reg.exec(targetText);
我只得到了第一个,但没有得到第二个。。。。 我只能得到T1,但不能得到T2,T3

尝试在字符串上使用而不是exec(),不过也可以使用exec循环。Match应该一次完成所有比赛。我认为您也可以省略全局说明符

targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"    
reg = new RegExp(/e(.*?)e/g);   
var result;
while (result = reg.exec(targetText))
{
    ...
}
reg = new RegExp(/e(.*?)e/);   
var matches = targetText.match(reg);

三种方法取决于您想用它做什么:

  • 循环完成每项比赛:

  • 快速循环并替换每个匹配项:

  • 循环并在飞行中做一些事情:


在遵循上述建议的同时,我不断得到无限循环,例如:

var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}
每次分配给
result
的对象是:

["", "", index: 50, input: "target text", groups: undefined]
因此,在我的案例中,我将上述代码编辑为:

const reg = /e(.*?)e/g;
let result = reg.exec(targetText);
while(result[0] !== "") {
    doSomethingWith(result);
    result = reg.exec(targetText);
}

您还可以使用String.replace方法循环所有元素

result=[];
//把所有的数字都记下来
“SomeT1extSomeT2extSomeT3ext”。替换(/(\d+?)/g,函数(wholeMatch,num){
//在这里表演或在循环之后表演。。。
console.log(result.push(num));
返回全部匹配;
});
console.log(结果);//['1', '2', '3']

问候

我实际上是在处理这个问题。我更喜欢Lambda函数

reg = /e(.*?)e/gm;   
var result = reg.exec(targetText);

result.forEach(element => console.log(element));

我是在一个控制台会话(Chrome)中完成的



有人能推荐一个for-loop方法吗?不要链接到w3schools。他们与W3C无关,有很多错误信息。看。@MindVirus-如果你愿意检查的话,他们已经清理了W3傻瓜网站指出的很多东西。我仍然使用它们作为一种快速的,但不是决定性的资源。就像在K&R C上使用备忘单来查找一些简单的东西一样,作为一名中级开发人员,我在W3学校已经遇到了六个明显的错误。它们不在我的参与方列表中。
String.prototype.match的MDN引用中
-不同之处在于,您不能使用
String.match
,而
RegExp.exec
获取捕获的组。与其使用新的RegExp,然后插入RegExp,只需执行
reg=/e(.>)e/g使用新运算符是多余的,除非您正在向其输入字符串。另外,请确保使用全局标志(/g)来标记此对象,否则可能会导致无限循环。请注意,在以这种方式使用之前,必须将正则表达式指定给对象:
/e(.*).e/.exec(…)
将产生无限循环。@RaviParekh:您添加了
/g
修饰符吗?为了子孙后代,RegExp需要在while循环之外声明;否则您仍然会得到一个无限循环。您还可以缩短while表达式:
while(result=reg.exec(targetText)){
利用“false”解析。讽刺的是,我的Lint想在while表达式中用
==
代替
=
。要使eslint接受单个
=
赋值,可以用括号括起来,如:
while((result=regex.exec(targetText)))
在第二个示例中,匹配一个关键字或变量?如果它是一个变量,它包含什么?@colepery
match
是整个RegExp匹配,而
$1
是第一个捕获组
()
,在该示例中,只有一个。在这里,只有replace起作用,因为在Node.js中,全局匹配/exec只返回不带组的总匹配。它不起作用。在js中,regex无法提取带有全局标志的组,因此用户将只收到总匹配。这只找到了第一个匹配。这是因为regex。您必须接受空的st用问号打电话
var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}
["", "", index: 50, input: "target text", groups: undefined]
const reg = /e(.*?)e/g;
let result = reg.exec(targetText);
while(result[0] !== "") {
    doSomethingWith(result);
    result = reg.exec(targetText);
}
reg = /e(.*?)e/gm;   
var result = reg.exec(targetText);

result.forEach(element => console.log(element));
> let reg = /[aeiou]/g;
undefined
> let text = "autoeciously";
undefined
> matches = text.matches(reg);
(7) ["a", "u", "o", "e", "i", "o", "u"]
> matches.forEach(x =>console.log(x));
a
u
o
e
i
o
u