Причина, по которой ваша программа зависает, - катастрофический возврат .
Части вашего регулярного выражения (\w+\s*\w+)+
и \w+.\w+
допускают так много перестановок, что механизм регулярных выражений застревает в почти бесконечном цикле. Отладчик RegexBuddy завершает работу после 1000000 шагов.
Это происходит только в том случае, если шаблон не может успешно соответствовать, что побуждает механизм регулярных выражений попробовать любую и все другие перестановки, которые допускает шаблон. Как правило, повторяющиеся группы, содержащие повторяющиеся квантификаторы, опасны.
Каковы реальные требования? Чтобы соответствовать пути, который содержит только буквы, цифры, подчеркивания и обратные слеши? Или просто строка между кавычками? Возможно, вы могли бы пролить свет на это ...
До этого я предлагаю следующее:
"(?<=^|\s)/p:""\w:(\\[\w\s]++)+\.\w+""(?=\s|$)"
Это очищает несколько вещей: (\\[\w\s]++)
соответствует обратной косой черте, за которой следует любое количество буквенно-цифровых и пробельных символов. Как только они сопоставлены, механизм регулярных выражений отказывается пробовать другую перестановку (это достигается с помощью возможного квантификатора ++
вместо просто +
.
После этого он соответствует точке (ваша версия будет соответствовать любому символу) и последовательности буквенно-цифровых символов. Затем кавычка, а затем она проверяет, следует ли пробел или конец строки. Если нет, регулярное выражение не будет выполнено и быстро завершится неудачей.
Если вы хотите сопоставить строку между кавычками, тогда
"(?<=^|\s)/p:""[^""]+""(?=\s|$)"
самый лучший и быстрый способ.