首页 > 解决方案 > 正则表达式:数组匹配

问题描述

我需要一个正则表达式来匹配以下可以嵌套的数字数组。这些应该通过:

[]
[1, 2, 3]
[1, 2, 3, [1,2,3], 5]

但以下应该无法通过测试:

abc 
1
[1,2,3
[#]

这有效:

/(^\[)(\d+\,|\s(?:(|\,))|\d+|\s\[|\]\,)*(\]$)/g

有没有更好的方法来达到相同的结果。我尝试过前瞻,但不完全理解它,也无法让它工作。

标签: javascriptregex

解决方案


正则表达式方法可以如下:从所有嵌套结构中删除括号,然后检查结果字符串是否遵循[+number+1 或更多重复,+ numbers+]模式:

var s = ['[]', '[1, 2, 3]', '[1, 2, 3, [1,2,3], 5]', '1', '[1,2,3', '[#]'];
var rx = /(?!^)\[([^\][]*)]/;
var valid_rx = /^\[(?:\s*\d+(?:\s*,\s*\d+)*)?\s*]$/;
for (var i=0; i<s.length; i++) {
  var test_string = s[i];
  console.log(test_string);
  while (rx.test(test_string)) {
    test_string = test_string.replace(rx, "$1")
  }
  console.log(valid_rx.test(test_string));
}

第一个正则表达式 ,/(?!^)\[([^\][]*)]/查找[...]不在字符串起始位置的子字符串。在[and之间],不可能有[nor ]while循环将这些括号一一删除,直到不匹配。

第二个正则表达式,^\[(?:\s*\d+(?:\s*,\s*\d+)*)?\s*]$验证结果字符串:

  • ^- 字符串的开始
  • \[- 一个[
  • (?:- 非捕获组:
    • \s*- 0+ 个空格
    • \d+- 1+ 位数
    • (?:\s*,\s*\d+)* - 0 次或多次重复,,包含 0+ 个空格、1+ 个数字
  • )?- 可选组的结束
  • \s*- 0+ 个空格
  • ]- 一个]
  • $- 字符串结束。

推荐阅读