在javascript中使用正则表达式解析数组语法

时间:2019-02-20 17:18:12

标签: javascript regex

我找到了这个here的答案,但是它在php中。

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

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

问题在于,如果输入为[123, "hehe, "lala"],则表示正则表达式匹配,但是语法不正确。

如何仅在数组语法正确的情况下使其匹配?

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

编辑:我只尝试使用数组中的字符串和数字来完成此操作。

2 个答案:

答案 0 :(得分:2)

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

每个项目都应该

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

\d+:一个数字

每个项目应在

之后

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

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

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

答案 1 :(得分: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