繁体   English   中英

preg_match_all JS 等价物?

[英]preg_match_all JS equivalent?

在 Javascript 中是否有相当于 PHP 的 preg_match_all ? 如果没有,将正则表达式的所有匹配项放入数组的最佳方法是什么? 我愿意使用任何 JS 库来简化它。

您可以将match与 global 修饰符一起使用:

>>> '1 2 3 4'.match(/\d/g);
["1", "2", "3", "4"]

John Resig 在他的博客上写了一个很棒的技巧,叫做“搜索而不是替换

它使用 javascript 的 replace 函数工作,该函数接受一个回调函数,并且不返回任何内容以保持原始内容不变。

这比使用全局匹配和迭代结果数组更简洁,尤其是在捕获多个组时。

JS 中 PHP 中 preg_match_all 的更好等价物是使用 exec() 函数。 这也将允许您捕获组,使用 match() 您不能这样做。

例如,您想从变量 myString 中捕获所有时间和括号中的数字:

var myString = "10:30 am (15 left)11:00 am (15 left)11:30 am";
var pattern = /(\d{1,2}:\d{1,2}\s?[ap]m)\s\((\d+)/gi;
var match;
while (match = pattern.exec(myString)){
  console.log('Match: "' + match[0] + '" first group: -> "' + match[1] + '" second group -> ' + match[2]);
}

输出将是:

Match: "10:30 am (15" first group: -> "10:30 am" second group -> 15
Match: "11:00 am (15" first group: -> "11:00 am" second group -> 15

使用new RegExp().test()

 function preg_match_all(regex, str) { return new RegExp(regex,'g').test(str) }

如果您需要像在 php.ini 中一样的完全返回结构。 使用前请自行检查)

解决方案(在打字稿上):

function preg_match_all(regex: RegExp, str: string) {
  return [...str.matchAll(new RegExp(regex, 'g'))].reduce((acc, group) => {
    group.filter((element) => typeof element === 'string').forEach((element, i) => {
      if (!acc[i]) acc[i] = [];
      acc[i].push(element);
    });

    return acc;
  }, [] as string[][]);
}

示例(在 javascript 上):

 const str = ';9N;N1;CP-S2;EU;CP-S3;E;CP-S4;KRT;VH;;VL;CP-S2;CP-S3;CP-S4'; const regex = /CP-(S[\\d*])/; const result = preg_match_all(regex, str); console.log(result); function preg_match_all(regex, str) { return [...str.matchAll(new RegExp(regex, 'g'))].reduce((acc, group) => { group.filter((element) => typeof element === 'string').forEach((element, i) => { if (!acc[i]) acc[i] = []; acc[i].push(element); }); return acc; }, []); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM