javascript 正则表达式匹配JSON字符串

hfyxw5xn  于 2023-04-19  发布在  Java
关注(0)|答案(2)|浏览(254)

我正在从头开始构建一个JSON验证器,但我对字符串部分很感兴趣。JSON.org:

我的regex到目前为止是:

/^\"((?=\\)\\(\"|\/|\\|b|f|n|r|t|u[0-9a-f]{4}))*\"$/

它确实通过一个反斜杠后跟一个字符和一个空字符串来匹配条件。但我不确定如何使用UNICODE部分。
是否有正则表达式可以匹配任何UNICODE字符expert“或\或控制字符?它是否匹配换行符或水平制表符?
最后一个问题是因为正则表达式匹配字符串“\t”,但不匹配““(四个空格,但目的是作为制表符)。否则我需要用它扩展正则表达式,这不是问题,但我猜水平制表符是UNICODE字符。
多亏了Jaeger Kor,我现在有了下面的正则表达式:

/^\"((?=\\)\\(\"|\/|\\|b|f|n|r|t|u[0-9a-f]{4})|[^\\"]*)*\"$/

它看起来是正确的,但是否有任何方法来检查控制字符,或者这是不需要的,因为它们出现在www.example.com上的非打印字符上regular-expressions.info?。
更新:正则表达式如下,以防有人需要它:

/^("(((?=\\)\\(["\\\/bfnrt]|u[0-9a-fA-F]{4}))|[^"\\\0-\x1F\x7F]+)*")$/
mrwjdhj3

mrwjdhj31#

为你的确切问题创建一个字符类

# Matches any character that isn't a \ or "
/[^\\"]/

然后你可以在最后加上 *,得到0或无限个,或者1或一个无限个,加上+

/[^\\"]*/

/[^\\"]+/

下面还有一个,在https://regex101.com/中搜索json时可以在library选项卡下找到

/(?(DEFINE)
# Note that everything is atomic, JSON does not need backtracking if it's valid
# and this prevents catastrophic backtracking
(?<json>(?>\s*(?&object)\s*|\s*(?&array)\s*))
(?<object>(?>\{\s*(?>(?&pair)(?>\s*,\s*(?&pair))*)?\s*\}))
(?<pair>(?>(?&STRING)\s*:\s*(?&value)))
(?<array>(?>\[\s*(?>(?&value)(?>\s*,\s*(?&value))*)?\s*\]))
(?<value>(?>true|false|null|(?&STRING)|(?&NUMBER)|(?&object)|(?&array)))
(?<STRING>(?>"(?>\\(?>["\\\/bfnrt]|u[a-fA-F0-9]{4})|[^"\\\0-\x1F\x7F]+)*"))
(?<NUMBER>(?>-?(?>0|[1-9][0-9]*)(?>\.[0-9]+)?(?>[eE][+-]?[0-9]+)?))
)
\A(?&json)\z/x

这应该匹配任何有效的JSON,你也可以在上面的网站测试它
编辑:
Link to the regex

368yc8dk

368yc8dk2#

使用这个,也适用于数组jsons [{...},{...}]:

((\[[^\}]{3,})?\{s*[^\}\{]{3,}?:.*\}([^\{]+\])?)

Demo:https://regex101.com/r/aHAnJL/1

相关问题