【问题标题】:Parsing array syntax using regex in javascript在javascript中使用正则表达式解析数组语法
【发布时间】:2019-07-14 11:25:42
【问题描述】:

我找到了here 的答案,但它在 php.ini 中。

我想匹配像[123, "hehe", "lala"] 这样的数组,但前提是数组语法正确。

我制作了这个正则表达式/\["?.+"?(?:,"?.+"?)*\]/

问题是如果输入的是[123, "hehe, "lala"],正则匹配,但是语法不正确。

如果数组语法正确,我怎样才能让它只匹配?

我的问题是在匹配第一个 " 时需要第二个 "

编辑:我只是尝试仅使用数组中的字符串和数字来实现。

【问题讨论】:

  • 数组里面的数组呢?你需要处理这些吗?还是只是字符串和数字的数组?
  • 您的.+ 没有太多限制,只有换行符。此外,您在两侧都缺少锚点 ^$。请注意,您还需要确保支持转义序列。尽管可能,但最终对于正则表达式来说几乎不是一份工作。
  • JSON.parse 这样做。
  • @str 这就是我刚要建议的...... :) try { JSON.parse('["one", 1,2]'); console.log("valid"); } catch(e) { console.log("invalid"); }
  • JSON 是一个字符串,.. 字符串化的 json 是什么意思?

标签: javascript regex


【解决方案1】:

您必须有两个(或更多)单独的表达式(使用 | 运算符)才能做到这一点。

所以应该是这样的:

/\[\s*("[^"]*"|[0-9]+)(\s*,\s*("[^"]*"|[0-9]+))*\s*\]/

(您可能还想在开头使用 ^ 并在结尾使用 $ 以确保在数组之前/之后没有其他内容出现:/^...snip...$/ 从头到尾匹配字符串。 )

如果您需要带指数的浮点数,请添加句点和“e”字符:[0-9.eE]+(这就是我没有使用 \d+ 的原因,因为在这种情况下只允许使用数字。)数字是有效的,显然要复杂得多(符号,带/不带符号的指数,仅在小数点之前或之后的数字......)

您还可以支持单引号字符串。这也是一个单独的表达式:'[^']*'

您可能还希望在括号前后允许空格(开始:/^\s*\[...,结束:...\]\s*$/)。

最后,如果您想真正支持 JavaScript 字符串,您需要添加对反斜杠的支持。像这样的东西:("([^"]|\\.)*").

注意

您的.+ 表达式也将匹配",,并且没有^$ 的数组如下匹配您的表达式就好了:

This Array ["test", 123, true, "this"] Here

【讨论】:

    【解决方案2】:

    你可以试试这个正则表达式:/\[((\d+|"([^"]|\\")*?")\s*,?\s*)*(?<!,)\]/

    每个项目都应该

    "([^"]|\\")*?": 以 " 开头和结尾,包含除 " 之外的任何内容。如果包含 ",则应转义 (\")。

    \d+:一个数字

    每个项目之后应该是

    \s*,?\s*:一个逗号,前后有任意数量的空格。

    并且在右括号之前不应该是逗号:(?<!,)

    演示:https://regex101.com/r/jRAQUc/1

    【讨论】:

      猜你喜欢
      • 2014-05-08
      • 2016-12-20
      • 2010-11-06
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多