javascript - JavaScript中字符串数组的正则表达式匹配
问题描述
我在Regex
. 我想在输入字符串中找到完整匹配字符串的开始和结束索引。
例如,我有一个字符串数组,例如
["a", "aa"]
我有一个像I like a problem aa
我正在处理数组字符串的迭代。
let arr = ["a", "aa"];
let str = "I like a problem aa";
let indicesArr = [];
arr.forEach(a=>{
const regexObj = new RegExp(a, "gi");
let match;
while ((match = regexObj.exec(str))) {
let obj = { start: match.index, end: regexObj.lastIndex }
indicesArr.push(obj);
if(!match.index || !regexObj.lastIndex) break;
}
});
上面的代码给了我结果
[
{start: 7, end: 8},
{start: 17, end: 18},
{start: 18, end: 19},
{start: 17, end: 19}
]
我想要的结果应该是
[
{start: 7, end: 8},
{start: 17, end: 19}
]
任何建议都会非常有帮助,谢谢:)
解决方案
这里的问题是a
在aa
. 您需要确保匹配所有出现的正则表达式,该正则表达式在此 orderaa
中找到or 。这意味着,正则表达式必须是,而不是regex中的交替顺序。a
/aa|a/g
/a|aa/g
在这里,您可以使用
let arr = ["a", "aa"];
let str = "I like a problem aa";
let indicesArr = [];
arr.sort((a, b) => b.length - a.length);
const regexObj = new RegExp(arr.map(x=> x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|'), "gi");
let match;
while (match = regexObj.exec(str)) {
let obj = { start: match.index, end: regexObj.lastIndex }
indicesArr.push(obj);
}
console.log(indicesArr);
注意这两行:
arr.sort((a, b) => b.length - a.length);
-arr
按长度按降序对项目进行排序(放在aa
前面a
)const regexObj = new RegExp(arr.map(x=> x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|'), "gi");
- 转义arr
数组中的所有项目以在正则表达式中使用,并使用|
交替运算符将项目连接成单个字符串正则表达式模式。
推荐阅读
- python - 基数为 10 的 int() 的无效文字:'(1,2,3,4,5,6,7)'
- git - Git stash 和 unstash 删除了我的 stash 而不将其添加到版本中
- sql - 间隔从数据库中提取订单详细信息
- c# - C#在解析csv时循环跳过virst行
- java - React Native:在没有重复的情况下覆盖包上的错误
- aws-lambda - 是否有任何 API 来检测运行 Lambda 的 AWS 堆栈名称
- linux - 如何在 Linux 中查找最近或今天修改过的文件
- python - 在没有 for 循环的情况下将数组中的所有条目增加 'n'
- c - C - 程序在 do-while 循环后结束
- nginx - nginx 为特定位置提供特定目录