javascript - 正则表达式:数组匹配
问题描述
我需要一个正则表达式来匹配以下可以嵌套的数字数组。这些应该通过:
[]
[1, 2, 3]
[1, 2, 3, [1,2,3], 5]
但以下应该无法通过测试:
abc
1
[1,2,3
[#]
这有效:
/(^\[)(\d+\,|\s(?:(|\,))|\d+|\s\[|\]\,)*(\]$)/g
有没有更好的方法来达到相同的结果。我尝试过前瞻,但不完全理解它,也无法让它工作。
解决方案
正则表达式方法可以如下:从所有嵌套结构中删除括号,然后检查结果字符串是否遵循[
+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+ 个空格]
- 一个]
$
- 字符串结束。
推荐阅读
- python - 冻结除输出/logits 之外的所有层
- android - 当我将 ListView 放在列中时,我得到“引发了另一个异常:未布置 RenderBox”
- python-2.7 - 如何从与当前脚本的父目录平行的目录导入 .py 文件?
- ruby - Ruby 的块语法的起源是什么?
- javascript - 在返回的内部函数中访问参数对象
- r - 我可以用一个表达式引用多个正则表达式项吗?
- api - 使用 fetch api 调用带有 keepalive 的 POST 请求时,预检请求失败
- batch-file - 如何使用命令行更改 SRP 安全级别
- ruby-on-rails - 使用 Solr Sunspot 索引关联模型 - Rails
- typescript - 在单击链接之前和之后使用包含之类的内容验证文本