【问题标题】:JS Regex match numbers between bracketsJS正则表达式匹配括号之间的数字
【发布时间】:2021-06-03 23:17:32
【问题描述】:

我有以下代码,但没有输出。当我在这里运行它时,它似乎可以工作:

https://regex101.com/r/FVkJfF/1

var strng = '[,][123,1][,][456,2][,][789,3][,][,][,][,][,][,][,][,]';
var rgx = \[(.[0-9,]+)\];  
var outstr = strng.match(rgx).join(',');
Write(outstr);
  

为了澄清,我的目标是捕获括号之间的所有值,如果它们包含一个数字(包括该组的开始和结束括号)

猜我在某处做错了什么?

【问题讨论】:

  • 是时候进一步了解 Javascript 中的正则表达式了:有一个 matchAll 函数。另外,请记住[0-9]\d 相同。
  • 谢谢!不过还是没有运气:(
  • 还记得在regex101.com上测试你的正则表达式

标签: javascript regex brackets


【解决方案1】:

试试这个:

/\[\d+,\d+\]/g

它匹配一个子字符串,如果它包含:

  • 左括号
  • 一个整数
  • 逗号
  • 另一个整数
  • 右括号

……按这个顺序,没有任何空格。

另请注意,正则表达式文字以/ 开头。您在 sn-p 中定义 var rgx 的方式是 SyntaxError

【讨论】:

  • 这不是正确答案,因为它与[123,123,123,12] in [,][123,1][,][456,2][,][789,3][,][123,123,123,12][,][,][,][,][,][,] regex demo 不匹配
【解决方案2】:

使用简单的

/\[(\d[\d,]*)]/g

regex proof

解释

--------------------------------------------------------------------------------
  \[                       '['
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \d                       digits (0-9)
--------------------------------------------------------------------------------
    [\d,]*                   any character of: digits (0-9), ',' (0
                             or more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  ]                        ']'

const regex = /\[(\d[\d,]*)]/g;
const str = `[,][123,1][,][456,2][,][789,3][,][,][,][,][,][,][,][,]`;
let m;

while ((m = regex.exec(str)) !== null) {
   console.log(m[0]);
}

【讨论】:

    【解决方案3】:

    您的正则表达式模式似乎不正确。 Javascript 要求您在正则表达式中使用方括号时正确转义它们。 这应该是您的正则表达式模式:

    const rgx = /\[(.[0-9,]+)\]/gm;
    

    这可以进一步简化

    const rgx = /\[(.[\d,\d]+)\]/gm;
    

    但是,您不会使用 join 方法实现您要查找的内容,因为 match 不返回数组,而只是返回第一个匹配项,因此您无法加入单个元素。看看matchAll 方法。

    【讨论】:

      【解决方案4】:

      您需要更改正则表达式

      \[(?:\d+,\d+)+\]
      

      【讨论】:

        【解决方案5】:

        匹配方括号之间的所有数字,至少有一个逗号但没有连续的逗号,如1,,2

        \[\d+(?:,\d+)+]
        

        说明

        • \[匹配[
        • \d+ 匹配 1+ 位
        • (?:,\d+)+ 重复 1+ 次匹配 , 和 1+ 个数字
        • ] 匹配]

        Regex demo

        const regex = /\[\d+(?:,\d+)+]/g;
        [
          "[,][123,1][,][456,2][,][789,3][,][,][,][,][,][,][,][,]",
          "[123,1,2,34]",
          "[123,1,2]",
          "[123]",
          "[]",
          "[1,,2]",
          "[,1,2]"
        ].forEach(s => Array.from(s.matchAll(regex), m => {
          if (m) {
            console.log(m[0]);
          }
        }));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-06
          • 1970-01-01
          • 1970-01-01
          • 2017-01-08
          • 1970-01-01
          • 1970-01-01
          • 2014-10-31
          相关资源
          最近更新 更多