我需要一个正则表达式来匹配以下可嵌套的数字数组。这些应该通过:
[]
[1, 2, 3]
[1, 2, 3, [1,2,3], 5]
但是以下内容将使测试失败:
abc
1
[1,2,3
[#]
这有效:
/(^\[)(\d+\,|\s(?:(|\,))|\d+|\s\[|\]\,)*(\]$)/g
是否有更好的方法可以达到相同的结果。我尝试了前瞻性操作,但并没有完全理解它,因此无法正常工作。
答案 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*
-一个]
]
-字符串的结尾。