Регулярное выражение (длинная строка) - PullRequest
0 голосов
/ 02 мая 2019

У меня есть условие RegExp /^([0-9]*\.?[0-9])*$/ для проверки строки.Сначала моя строка - 1.2.840.346991791506342.1482500253171661 (большая строка), а вторая - 1.2.3.201922311129.10038 (короткая строка).

Он успешно выполняет поиск, поскольку обе строки в порядке.

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

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

Лимит RegExp исчерпан?Каким будет решение?

Вы можете проверить это в блокноте + для целей тестирования ^([0-9]*\.?[0-9])*$ использовать эту формулу напрямую.

1 Ответ

3 голосов
/ 02 мая 2019

То, как вы написали свое регулярное выражение, имея вложенный квантификатор, приводит к катастрофическому возврату , что приводит к зависанию / тайм-ауту.

Демонстрация катастрофического возврата назад

Вам нужно упростить свое регулярное выражение до чего-то подобного,

^[0-9]*(?:\.[0-9]+)*$

Дайте мне знать, сохраняет ли это регулярное выражение ваш шаблон.

Демонстрация регулярных выражений не работает в течение тайм-аута

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

135228 принятых шагов

и если вы немного увеличите длину строки, то это приведет к тайм-ауту / катастрофическому возврату.

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