javascript - 正则表达式连续循环而不终止寻找匹配
问题描述
我需要找到匹配的位置,我试过了
function myFunction() {
var myvar_thru_textbox="u?"
var ptrn = new RegExp(myvar_thru_textbox, "gim");
var match;
while ((match = ptrn.exec("color colour")) != null) {
console.log(JSON.stringify(match));
}
}
此代码使用字符串“”产生无限输出
当模式更改为“ou?”时 它产生正确的输出,为什么?如果前面有一个字符,字符会变为无穷大?
我只希望在“u?”时产生“”或“u”。使用正则表达式。
解决方案
根据文件,
JavaScript RegExp 对象在设置了全局或粘性标志(例如
/foo/g
或/foo/y
)时是有状态的。他们存储lastIndex
上一场比赛的 a。...
如果匹配成功,则 exec() 方法返回一个数组并更新
lastIndex
正则表达式对象的属性。
现在想象一下第一次迭代会发生什么。正则表达式在索引 0 处找到零宽度匹配,因此将其设置lastIndex
为 0。然后在第二次迭代中,它从 0 开始搜索,在那里找到另一个零宽度匹配,因此lastIndex
再次设置为 0。并且循环继续。
因此,您应该在那里放置一个 if 语句来检查匹配是否为零宽度。如果是,请增加最后一个索引,这样它就不会再次给您相同的匹配项。
function myFunction() {
var ptrn = new RegExp("u?", "gim");
var match;
var i = 0;
while ((match = ptrn.exec("color colour")) != null) {
console.log(JSON.stringify(match));
if (match.index == ptrn.lastIndex) {
ptrn.lastIndex++;
}
}
}
myFunction()
推荐阅读
- laravel - 如何检查外部表中是否存在用户ID
- php - 即使产品存在,WooCommerce get_name() 函数也会引发错误
- php - 流明中的覆盖供应商文件不起作用
- javascript - 有条件地渲染边框颜色 React Native
- php - 在 apache2 服务器上将具有其他扩展名的文件作为 .php 文件运行
- python - Python Selenium 线程
- python - Python selenium - 单击也有下拉文本的复选框
- vue.js - Nuxt 中同一级别的多个动态路由可能吗?
- scala - 如何将嵌套的 json 转换为特定的数据框
- typescript - 将 typescript 类型转换为 proto 文件