正则表达式:数组匹配

时间:2019-02-19 09:30:05

标签: javascript regex

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

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

但是以下内容将使测试失败:

abc 
1
[1,2,3
[#]

这有效:

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

是否有更好的方法可以达到相同的结果。我尝试了前瞻性操作,但并没有完全理解它,因此无法正常工作。

1 个答案:

答案 0 :(得分:5)

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

]

第一个正则表达式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)); }查找不在字符串起始位置的/(?!^)\[([^\][]*)]/个子字符串。在[...][之间,不能有][]循环将这些括号一一删除,直到没有匹配为止。

第二个正则表达式while验证结果字符串:

  • ^\[(?:\s*\d+(?:\s*,\s*\d+)*)?\s*]$-字符串的开头
  • ^-一个\[
  • [-非捕获组:
    • (?:-超过0个空格
    • \s*-1个以上数字
    • \d+-(?:\s*,\s*\d+)*的0个或多个重复,并用0+个空格,1 +个数字
  • ,-可选组的结尾
  • )?-0 +空格
  • \s*-一个]
  • ]-字符串的结尾。