Вам необходимо удалить +
после \d
, поскольку в противном случае движку регулярных выражений потребовалось бы слишком много времени, чтобы протестировать все возможные способы сопоставления несовпадающей строки, прежде чем допустить несоответствие.
Использовать
(?:\W*\d)*(?!\w)
или
(?:\W*\d)*\b
\W
соответствует любому несловарному символу (то есть без цифры), а когда d
соответствует, \W*
будет потреблять 0 или болеенесловарные символы, обеспечивающие «линейный» способ сопоставления, когда последующий подшаблон не соответствует тому же тексту, что и предыдущий подшаблон.
Предпросмотр (?!\w)
работает немного быстрее, чем группа альтернатив (?:\W|$)
так как все, что он должен сделать, это проверить, является ли следующий символ словом char, и если да, совпадение не удалось.На самом деле, в этой ситуации, после \d
, (?!\w)
равен \b
, границе слова, так что это лучшая конструкция для использования в этой позиции.
См. Демонстрационный пример regex.