首页 > 解决方案 > 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}
]

任何建议都会非常有帮助,谢谢:)

标签: javascriptarraysregexstring

解决方案


这里的问题是aaa. 您需要确保匹配所有出现的正则表达式,该正则表达式在此 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数组中的所有项目以在正则表达式中使用,并使用|交替运算符将项目连接成单个字符串正则表达式模式。

推荐阅读