将单词(字符串)数组转换为正则表达式并使用它来获取字符串上的匹配项

kuu*_*uus 11 javascript regex arrays string

在正则表达式中转换字符串数组然后在不同字符串上多次使用正则表达式以获得结果匹配然后迭代它们的最简洁有效的方法是什么?现在我使用以下内容:

var myArray = ['peaches', 'bananas', 'papaya', 'supercity'];
var myString = 'I want some papaya and some peaches';

var regexFromMyArray = new RegExp(myArray.toString().replace(/,/g, '|'), 'gi');

var matches = myString.match(regexFromMyArray) || [];

if (matches.length) {
  for (var i = 0, l = matches.length; i < l; i++) {
    console.log('Found: ' + matches[i]);
  }
}
Run Code Online (Sandbox Code Playgroud)

性能在这里很重要,所以请简单的javascript.

Ami*_*oki 21

只需加入管道,使用 Array.join

var regexFromMyArray = new RegExp(myArray.join("|"), 'gi');
Run Code Online (Sandbox Code Playgroud)

只是这样做,因为if条件只是多余的.

for(var i = 0; i < matches.length; i++)
   console.log("Found:", matches[i]);
Run Code Online (Sandbox Code Playgroud)
  1. 正在使用单个方法而不是初始3.(toString内部调用join(",")),replace也不使用函数.
  2. 我们删除了一个不必要的if条件.所以这很快.

既然你谈到正则表达式,我想说

  1. 单个正则表达式初始化不会花费太多.
  2. 如果你的目标真的要匹配数组中的单词,那么就去吧String.indexOf,这是一种非正则表达形式的解决方法.

  • 好吧,我想你真的应该提一下,如果它们包含特殊的正则表达式字符,就需要转义输入字符串.此外,如果OP担心性能,他应该不再担心构建正则表达式的一次性成本,并且更担心实际的匹配性能.从这个角度来看,与单独检查每个字符串的方法相比,您是否可以看到正则表达式的性能? (2认同)

lua*_*wtf 7

这是当前接受的答案的改进版本,以函数形式呈现,该函数接受字符串数组和可选标志列表(作为字符串)。它解释包含特殊字符的字符串并对它们进行转义。它还以这样的方式对字符串进行排序,以便按照最大咀嚼原则的预期发挥作用。

const regexFrom = (strings, flags) =>
  new RegExp(
    strings
      // Escape special characters
      .map(s => s.replace(/[()[\]{}*+?^$|#.,\/\\\s-]/g, "\\$&"))
      // Sort for maximal munch
      .sort((a, b) => b.length - a.length)
      .join("|"),
    flags
  );


// Example

const strings = [".+", "apple", "[a-z]*", "app", "apps", "orange", "banana[]"];
const pattern = regexFrom(strings, "gi");

const string = "I really like Apple phones, they have great apps! Check out this regex: /.+/";

let result; while (result = pattern.exec(string)) {
  console.log(result[0]);
}
Run Code Online (Sandbox Code Playgroud)