【问题标题】:preg_match_all JS equivalent?preg_match_all JS 等效?
【发布时间】:2010-11-02 07:09:38
【问题描述】:

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

【问题讨论】:

    标签: php javascript regex phpjs


    【解决方案1】:

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

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

    【讨论】:

    • 我不懂那个语法。
    • @erm3nda 我认为 /\d/g 是你不明白。这里Creating a regular expression in Javascript
    • 请注意,这种方法会忽略捕获。 '1a 2b 3c 4d'.match(/(\d)([a-z])/g) 仅输出 ["1a", "2b", "3c", "4d"]。如果您需要捕获,请参阅this answer
    【解决方案2】:

    John Resig 在他的博客“Search and dont replace”上写了一个很棒的技术

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

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

    【讨论】:

      【解决方案3】:

      在 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
      

      【讨论】:

        【解决方案4】:

        使用new RegExp().test()

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

        【讨论】:

          【解决方案5】:

          如果你需要 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;
            }, []);
          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-12-25
            • 2015-01-31
            • 2015-12-05
            • 1970-01-01
            • 2014-08-29
            • 1970-01-01
            • 1970-01-01
            • 2021-09-15
            相关资源
            最近更新 更多