正则表达式匹配 JSON 字符串

Posted

技术标签:

【中文标题】正则表达式匹配 JSON 字符串【英文标题】:Regex to match a JSON String 【发布时间】:2015-11-16 06:33:06 【问题描述】:

我正在从头开始构建一个 JSON 验证器,但我对字符串部分非常坚持。我希望构建一个匹配 JSON.org 上的以下序列的正则表达式:

到目前为止,我的正则表达式是:

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

它确实与条件匹配,反斜杠后跟一个字符和一个空字符串。但我不确定如何使用 UNICODE 部分。

是否有正则表达式可以匹配任何 UNICODE 字符专家 " 或 \ 或控制字符?它会匹配换行符或水平制表符吗?

最后一个问题是因为正则表达式匹配字符串“\t”,而不是“”(四个空格,但想法是作为一个制表符)。否则我需要用它来扩展正则表达式,这不是问题,但我猜水平制表符是一个 UNICODE 字符。

感谢 Jaeger Kor,我现在有了以下正则表达式:

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

这似乎是正确的,但有什么方法可以检查控制字符,或者因为它们出现在regular-expressions.info 的不可打印字符上,所以不需要这样做?要验证的输入始终是来自 textarea 的文本。

更新:如果有人需要,正则表达式如下:

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

【问题讨论】:

【参考方案1】:

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

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

然后您可以在末尾添加 * 以获得 0 或无限数量的它们,或者使用 + 获得 1 或无限数量

/[^\\"]*/

/[^\\"]+/

下面还有这个,在搜索 json 时在 library 选项卡下的 https://regex101.com/ 找到

/(?(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

【讨论】:

感谢您的快速回复。我将它添加到我的第一个正则表达式中,它似乎工作正常。我对控制字符一无所知,但也许我不需要担心,因为输入来自可能不被接受的文本区域。您提供的最后一个正则表达式是一个完整的正则表达式,但我想要知道错误在哪里。但是,我会再次检查它是否更有用! 我一直在玩你最新的正则表达式,当拆分它们时,它们工作得很好!谢谢! 谢谢!搜索网址为:regex101.com/library?orderBy=MOST_POINTS&search=json 如果你可以发布一个使用这个正则表达式的代码 sn-p 会很有帮助,当我将它粘贴到我的代码中时,我遇到了很多语法错误

以上是关于正则表达式匹配 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章

java用正则表达式截取json多余的字符串

用于匹配 JSON 子字符串某些部分的 Java 正则表达式

什么时间用正则表达式什么时间用json提取器

Lua:字符串匹配和正则表达式

正则表达式怎么提取json中的value?

常用正则表达式