web-dev-qa-db-fra.com

Regex pour correspondre à une chaîne JSON

Je construis un validateur JSON à partir de zéro, mais je suis assez coincé avec la partie chaîne. J'espérais construire une expression régulière qui correspondrait à la séquence suivante trouvée sur JSON.org:

JSON.org String Sequence

Mon expression régulière jusqu'à présent est:

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

Il correspond aux critères avec une barre oblique inverse suivie d'un caractère et d'une chaîne vide. Mais je ne sais pas comment utiliser la partie UNICODE.

Existe-t-il une expression régulière pour correspondre à n'importe quel expert UNICODE "ou\ou un caractère de contrôle? Et correspondra-t-il à une nouvelle ligne ou à un onglet horizontal?

La dernière question est parce que l'expression régulière correspond à la chaîne "\ t", mais pas à "" (quatre espaces, mais l'idée est d'être un onglet). Sinon, je devrai développer le regex avec lui, ce qui n'est pas un problème, mais je suppose que l'onglet horizontal est un caractère UNICODE.

Grâce à Jaeger Kor, j'ai maintenant l'expression régulière suivante:

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

Il semble être correct, mais existe-t-il un moyen de vérifier les caractères de contrôle ou est-ce inutile car ils apparaissent sur les caractères non imprimables sur regular-expressions.info? L'entrée à valider est toujours le texte d'une zone de texte.

Mise à jour: l'expression régulière est la suivante au cas où quelqu'un en aurait besoin:

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

Pour votre question exacte, créez une classe de personnages

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

Et puis vous pouvez simplement ajouter * à la fin pour obtenir 0 ou un nombre illimité d'entre eux ou bien 1 ou un nombre illimité avec +

/[^\\"]*/

ou

/[^\\"]+/

Il y a aussi ceci ci-dessous, trouvé à https://regex101.com/ sous l'onglet bibliothèque lors de la recherche de json

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

Cela devrait correspondre à n'importe quel json valide, vous pouvez également le tester sur le site Web ci-dessus

ÉDITER:

Lien vers l'expression régulière

12
Jaeger Kor