私はJSONバリデーターをゼロから構築していますが、文字列部分にはかなりこだわっています。私の希望は、JSON.orgにある次のシーケンスに一致する正規表現を作成することでした。
これまでの正規表現は次のとおりです。
/^\"((?=\\)\\(\"|\/|\\|b|f|n|r|t|u[0-9a-f]{4}))*\"$/
バックスラッシュの後に文字と空の文字列が続く条件に一致します。しかし、UNICODE部分の使用方法がわかりません。
UNICODE文字のエキスパート "または\または制御文字に一致する正規表現はありますか?そして、改行または水平タブに一致しますか?
最後の質問は、正規表現が文字列「\ t」と一致するが、「」とは一致しないためです(4つのスペース。ただし、アイデアはタブになります)。そうでなければ、それで正規表現を展開する必要がありますが、これは問題ではありませんが、水平タブは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]+)*")$/
正確な質問のために、キャラクタークラスを作成してください
# Matches any character that isn't a \ or "
/[^\\"]/
そして、最後に*を追加するだけで、0または無制限の数、または1か+の無制限の数を取得できます。
/[^\\"]*/
または
/[^\\"]+/
また、jsonを検索するときにライブラリタブの下にある 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と一致する必要があります。上記のWebサイトでテストすることもできます
編集: