У меня есть сценарий, в котором мне нужно проверить, действителен ли частичный ввод (см. Ниже) JSON или нет? Я сослался на этот ответ , чтобы определить, является ли данная строка действительной JSON или нет.
Пример ввода:
{
"JSON": [{
"foo":"bar",
"details": {
"name":"bar",
"id":"bar",
Что я пробовал до сих пор:
/ (?(DEFINE)
(?<number> -? (?= [1-9]|0(?!\d) ) \d+ (\.\d+)? ([eE] [+-]? \d+)? )
(?<boolean> true | false | null )
(?<string> " ([^"\n\r\t\\\\]* | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* " )
(?<array> \[ (?: (?&json) (?: , (?&json) )* )? \s* \]{0,1} )
(?<pair> \s* (?&string) \s* : (?&json) )
(?<object> \{ (?: (?&pair) (?: , (?&pair) )* )? \s* \}{0,1} )
(?<json> \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* )
) \A (?&json)\,{0,1} \Z /six
Я сделал закрытие массива и объектов необязательным (допускается ноль или один раз ). Но в некоторых случаях это не удастся, например, когда вы открываете объект, не закрывая другой объект (как показано ниже), регулярное выражение все равно найдет совпадение.
Неправильно, но все еще совпадает:
{
"JSON": [{
"foo":"bar",
"details": {
"name":"bar",
"id":"bar",{
Как проверить частичный JSON ввод?
РЕДАКТИРОВАТЬ:
Как отмечено @ntahdh
в комментариях, это регулярное выражение не будет работать с java.util.regex
. Так что теперь мне нужно регулярное выражение, которое должно работать без рекурсии