Предотвратите катастрофическое отступление в этом регулярном выражении - PullRequest
0 голосов
/ 11 февраля 2019

(\W*\d+)*(?=\W|$)

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

Я пытаюсь найти способ убрать катастрофический откат без изменения его логики, но пока у меня ничего нет.

Срок: 0000000000000000000000000000Abc

1 Ответ

0 голосов
/ 11 февраля 2019

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

Использовать

(?:\W*\d)*(?!\w)

или

(?:\W*\d)*\b

\W соответствует любому несловарному символу (то есть без цифры), а когда d соответствует, \W* будет потреблять 0 или болеенесловарные символы, обеспечивающие «линейный» способ сопоставления, когда последующий подшаблон не соответствует тому же тексту, что и предыдущий подшаблон.

Предпросмотр (?!\w) работает немного быстрее, чем группа альтернатив (?:\W|$)так как все, что он должен сделать, это проверить, является ли следующий символ словом char, и если да, совпадение не удалось.На самом деле, в этой ситуации, после \d, (?!\w) равен \b, границе слова, так что это лучшая конструкция для использования в этой позиции.

См. Демонстрационный пример regex.

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