2015-08-22 4 views
6

Sto costruendo un validatore JSON da zero, ma sono abbastanza bloccato con la parte di stringa. La mia speranza è stata la costruzione di un espressione regolare che corrisponda al seguente sequenza trovato su JSON.org:Regex per abbinare una stringa JSON

JSON.org String Sequence

mio regex finora è:

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

lo fa abbinare i criteri con un backslash seguito da un personaggio e una stringa vuota. Ma non sono sicuro di come usare la parte UNICODE.

C'è una regex per adattarsi a qualsiasi esperto UNICODE carattere "o \ o carattere di controllo? E sarà corrispondere un ritorno a capo o di tabulazione orizzontale?

L'ultima domanda è perché la regex hanno la stringa '\ t', ma non "" (quattro spazi, ma l'idea è di essere una scheda) Altrimenti dovrò espandere la regex con esso, che non è un problema, ma la mia ipotesi è che la linguetta orizzontale è un carattere UNICODE

Grazie a Jaeger Kor, ora ho la seguente espressione regolare:

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

Sembra corretto, ma esiste un modo per controllare i caratteri di controllo o non è necessario così come appaiono sui caratteri non stampabili su regular-expressions.info? L'input da convalidare è sempre testo da una textarea.

Aggiornamento: l'espressione regolare è come seguendo nel caso qualcuno ne ha bisogno:

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

risposta

7

Per la vostra domanda esatta creare una classe di caratteri

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

E poi si può semplicemente aggiungere * alla fine di ottenere 0 o numero illimitato di loro o in alternativa 1 o un numero illimitato con +

/[^\\"]*/ 

o

/[^\\"]+/ 

Inoltre v'è questa qui sotto, che si trova a https://regex101.com/ sotto la scheda libreria durante la ricerca di 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 

Questo dovrebbe adattarsi a qualsiasi JSON valida, si può anche verificare che presso il sito web di cui sopra

EDIT:

Link to the regex

+0

Grazie per la vostra q risposta rapida. L'ho aggiunto alla mia prima espressione regolare e sembra che funzioni bene. Non so nulla dei caratteri di controllo, ma forse non devo preoccuparmene perché l'input proviene da una textarea in cui potrebbero non essere accettati. L'ultima espressione regolare che hai fornito è stata una regex completa, ma Voglio sapere dove si trova l'errore. Ma di nuovo, lo controllerò se potrebbe essere più utile! – Sietse

+0

Ho giocato con la tua ultima regex e, quando li dividi, funzionano alla grande! Grazie! – Sietse

+1

Thx! L'URL di ricerca è: https://regex101.com/library?orderBy=MOST_POINTS&search=json – vbrajon