Regex для проверки карты JSON с необязательными переменными - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь проверить ответы JSON на вызовы веб-службы.

Всего существует 13 переменных, которые могут или не могут быть возвращены в таком отображении:

{"var1":"val1","var2":"val2","var3":"val3", ... "var13":"val13"}

Самый длинный ответ может иметь все тринадцать переменных, но типичный ответ больше похож на этот:

{"var4":"val4","var6":"val6","var10","val10"}

Мне нужно написать регулярное выражение, которое может захватывать значения, чтобы их можно было установить для отдельных переменныхв принимающей системе.

Необязательные группы без захвата, необязательные группы захвата, что делает каждый символ необязательным

Если в каждом ответе API присутствуют все 13 переменных, следующее регулярное выражение будет работать идеально:

\{"var1":"?(.*?)"?,"var2":"?(.*?)"?,"var3":"?(.*?)"?,"var4":"?(.*?)"?,"var5":"?(.*?)"?,"var6":"?(.*?)"?,"var7":"?(.*?)"?,"var8":"?(.*?)"?,"var9":"?(.*?)"?,"var10":"?(.*?)"?,"var11":"?(.*?)"?,"var12":"?(.*?)"?,"var13":"?(.*?)"?\}

Я перепробовал множество различных комбинаций, например, оборачивание переменных в необязательные группы без захвата, например:

\{(:?"var1":)?"?(.*?)"?,? ... \}

И создание самой группы захвата также необязательно:

\{(:?"var1":)?"?(.*?)?"?,? ... \}

Весь способ сделать каждый символ необязательным:

\{"?v?a?r?1?"?:?"?(.*?)?"?,? ... \}

Как мне решить эту проблему?

1 Ответ

2 голосов
/ 03 мая 2019

Используйте квантификатор, чтобы указать диапазон, в котором может появляться один и тот же шаблон:

\{"[^"]":"[^"]*"(?:,"[^"]+":"[^"]*"){0,12}\}

"[^"]+":"[^"]*" соответствует одной "var":"val" паре. Я предполагаю, что ваши переменные и значения не будут включать вложенные двойные кавычки (может быть способ разрешить экранированные кавычки, используя lookbehind, но я не уверен, как его кодировать). Требуется хотя бы один из них, а затем допускается до 12 дополнительных между ними.

Но делать это таким образом кажется очень хрупким. В дополнение к проблеме вложенных кавычек, я не позволил дополнительный пробел, я предполагаю жесткий формат. Правильный способ сделать это - проанализировать JSON и затем проверить полученный объект. Парсеры JSON доступны на большинстве языков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...