【问题标题】:Regex to match a JSON String正则表达式匹配 JSON 字符串
【发布时间】: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]+)*")$/

【问题讨论】:

    标签: javascript json regex unicode


    【解决方案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

    【讨论】:

    • 感谢您的快速回复。我将它添加到我的第一个正则表达式中,它似乎工作正常。我对控制字符一无所知,但也许我不需要担心,因为输入来自可能不被接受的文本区域。您提供的最后一个正则表达式是一个完整的正则表达式,但我想要知道错误在哪里。但是,我会再次检查它是否更有用!
    • 我一直在玩你最新的正则表达式,当拆分它们时,它们工作得很好!谢谢!
    • 如果你可以发布一个使用这个正则表达式的代码 sn-p 会很有帮助,当我将它粘贴到我的代码中时,我遇到了很多语法错误
    猜你喜欢
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多