Регулярное выражение работает нормально, пока не появятся круглые скобки - PullRequest
1 голос
/ 20 июня 2019

на производстве У меня возникла неприятная проблема, связанная с тем, что регулярное выражение принимает навсегда:

Регулярное выражение:

(?'Response'{\s*("([\w]+)"\s*:\s*"?((?'Message'[\s\w\d\.\\\-\/:;_']+(,[,\s\w\d\.\\\-\/:_]+)?)+)"\s*,*\s*)+})

Регулярное выражение само по себе отлично работает с таким сообщением, какследующее:

{ "ABC":[ { "Type":"K", "Message":"Any type of reasonable message 12345" } ]

Все падает, если я делаю что-то подобное (например, добавляя круглые скобки):

{ "ABC":[ { "Type":"K", "Message":"Any type of reasonable message 12345 (reasonable)" } ]

Я пробовал много путей, но я мог найти способ "включите "(и) в качестве допустимых символов.

Есть идеи, как это сделать?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Как отмечается в комментарии, самое лучшее, что можно сделать здесь, это использовать инструмент, который анализирует JSON. Это позволит вам лучше контролировать данные, так как они со временем меняются. Если при анализе JSON возникла проблема, возможно, это лучшее место для сосредоточения усилий.

Я хотел бы отметить, что вы, кажется, не соответствует литералу [], и поэтому может показаться, что ваше совпадение может потенциально совпадать с аналогичными значениями в первом разделе, где у вас в данный момент есть * 1004. *, так что будьте осторожны при очистке данных.

Есть два способа добавления в скобках. Вы можете либо продолжать делать то, что делаете в настоящее время, пытаясь придумать все, что вы можете разрешить в этой строке, и поэтому вы просто добавите дополнительные символы при их обнаружении. Таким образом, это решение будет работать:

(?'Response'{\s*("([\w]+)"\s*:\s*"?((?'Message'[\s\w\d\.\\\-\/:;_'\(\)]+(,[,\s\w\d\.\\\-\/:_]+)?)+)"\s*,*\s*)+})

Демонстрируется на https://regex101.com/r/xqP8BF/1

Однако вам может быть проще просто исключить все, что вы не хотите сопоставлять, в частности, ":

(?'Response'{\s*("([\w]+)"\s*:\s*"?("(?'Message'[^"]*)")\s*,*\s*)+})

Здесь продемонстрировано: https://regex101.com/r/pyaMaD/1

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

0 голосов
/ 20 июня 2019

Я предполагаю, что, если у нас нет других вариантов упражнений, возможно, мы упростим наше выражение до чего-то похожего на:

({\s*"([\w]+)"\s*:\s*"[A-Z]+"\s*,(\s*"[\w]+"\s*:\s*"[\w\d\s)(:;.']+"\s*,?)+\s*})

, хотя я не уверен, какие могут быть вероятные входы и желаемые выходы.

Демо

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