【问题标题】:Regular Expression: Array Match正则表达式:数组匹配
【发布时间】:2019-02-19 09:30:04
【问题描述】:

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

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

但以下内容应未通过测试:

abc 
1
[1,2,3
[#]

这行得通:

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

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

【问题讨论】:

  • [1, 2, 3, [1,2,3] 也通过了,我敢打赌这是不可取的?
  • 不,感谢您指出这一点。
  • [[[1]]] 怎么样?可以有不止一层嵌套吗?
  • 查看a demo on regex101.com 了解PCRE 引擎。
  • @WiktorStribiżew,您的解决方案非常出色。我基本上是在尝试做 JSON.parse 所做的事情,所以你给了我一个很好的起点。

标签: javascript regex


【解决方案1】:

正则表达式方法可以如下:从所有嵌套结构中删除括号,然后检查结果字符串是否遵循 [+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));
}

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

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

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

【讨论】:

  • 这是一种正确的方法,可以处理任何递归级别并验证任何 [...] 字符串,其中只有逗号分隔的数字块。
  • 鉴于正则表达式的要求,这是一个绝妙的答案。我只想补充一点,JSON.parse 也可以是一个解决方案,特别是如果需要对检测到的数组进行进一步处理。
  • 公平地说,要求是有一个匹配所述字符串的正则表达式。此答案使用正则表达式,但不提供此类正则表达式。真正的答案应该是 JS 的正则表达式引擎是不可能的,因为它不支持递归。
  • @ndnenkov 那将是评论,而不是答案。至少,这对 SO 没有附加价值。大家都知道JS regex does not support recursion
  • @WiktorStribiżew 显然要么 OP 不知道,要么她不知道需要创建这样的正则表达式。
猜你喜欢
  • 1970-01-01
  • 2016-01-15
  • 2019-01-13
  • 1970-01-01
  • 2011-08-26
  • 2014-02-06
相关资源
最近更新 更多