Марк Байерс прав в том, что причиной проблемы является катастрофическое возвращение назад , однако проблема возникает из-за последней части, а не бит, который соответствует букве диска.
Например, в
(?<FILE>
([a-zA-Z0-9_]+
(
([a-zA-Z0-9_\s_\-\.]*[a-zA-Z0-9_]+)
|
([a-zA-Z0-9_]+)
)\.
(?<EXTENSION>[a-zA-Z0-9]{1,6})
$)
)
вы можете видеть, что
([a-zA-Z0-9_\s_\-\.]*[a-zA-Z0-9_]+)
|
([a-zA-Z0-9_]+)
может соответствовать одной и той же строке несколькими различными способами, которые будут экспоненциально увеличиваться с длиной имени файла.
Когда случается, что часть расширения регулярного выражения не совпадает, движок регулярного выражения возвращает и пробует другую перестановку для части имени файла, надеясь, что это позволяет части расширения соответствовать - что, конечно, никогда не будет, но двигатель регулярных выражений не может понять это. RegexBuddy , когда его просят проверить регулярное выражение по указанному вами пути, прерывает попытку сопоставления после 1.000.000 итераций. Движок регулярных выражений C # будет работать до тех пор, пока не исчерпает все перестановки, в течение этого времени процессор будет удерживать 100%.
Чтобы это исправить, как правило, необходимо избегать повторений повторяющихся элементов, избегать чередований, которые соответствуют одним и тем же вещам, и, возможно, заключать части совпадения в атомные группы , которые не будут возвращены, если более поздняя часть регулярного выражения терпит неудачу.
В вашем случае, однако, лучше использовать правильные инструменты для работы, и это функции манипуляции путями .NET.