JS 正则表达式匹配括号之间的数字

JS Regex match numbers between brackets

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

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);
  

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

猜猜我哪里做错了什么?

试试这个:

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

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

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

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

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

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

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

这可以通过

进一步简化
const rgx = /\[(.[\d,\d]+)\]/gm;

但是,您无法使用 join 方法实现您想要的结果,因为 match 不是 return 数组,而是第一个匹配项,所以您不能连接单个元素。看看matchAll方法。

您需要更改正则表达式

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

使用简单

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

regex proof

解释

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

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]);
}

用至少一个逗号匹配方括号之间的所有数字,但没有连续的逗号,例如 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]);
  }
}));