У меня есть текст, из которого мне нужно извлечь все пути к файлам или папкам (жирный текст ниже). Пути без кавычек не имеют пробелов и должны сопоставляться так же, как и пути в кавычках. Это вариант регулярного выражения DOT.NET в C#.
«C:\Future\Code In Progress» произвольный несовпадающий текст C:\Data\Code v:\Bless\Test.txt «D:\APPZ\Bam Bam\Malkop.mp3»
Регулярное выражение ниже без проблем соответствует путям в кавычках, поэтому теперь мне нужно сопоставить пути без кавычек. Кроме того, регулярное выражение для путей без кавычек должно гарантировать, что пути не предшествует кавычка, чтобы исключить избыточность совпадений.
Regex.Matches (input, @"\""[a-zA-Z]:\\.*?\""", RegexOptions.IgnoreCase)
Регулярное выражение: @""[a-zA-Z]:\.*?"" не работает. Что я здесь делаю не так?
Это может привести вас очень близко к [a-zA-Z]:\(.*?)(?=([" ]*[a-zA-Z]:\)|(")), если вы добавите " или c :\\ до конца текста он полностью работает. Он извлекает все пути за один шаг. Надеюсь, это сработает для вас. Имейте в виду, что в случае несовпадающего текста после пути вам потребуется добавление, чтобы обнаружить эти случаи.





Используйте Regex в С#:
\"\w+\:(\\\w+[ \w+]*)+(\.\w+)?\"
Итак, ваш код должен быть:
Regex.Matches (input, @"\""\w+\:(\\\w+[ \w+]*)+(\.\w+)?\""", RegexOptions.IgnoreCase)
Вы можете проверить здесь: regexstorm.net
Объяснение регулярного выражения:
В итоге я использовал две строки регулярных выражений.
string quoted = @"(?<=\"")[a-zA-Z]:\\.*?(?=\"")";
string unquoted = @"(?<!\"")[a-zA-Z]:\\[^\s]*";
Прочтите спецификацию регулярного выражения и найдите решение — всего лишь несколько подсказок
[^и{0,1}и группировка с помощью(и)— и ваше регулярное выражение не будет работать, если в именах папок или файлов есть цифры или e. г. символы подчеркивания или даже символы Юникода для неанглийских языков или смайлы... все это разрешено в системных путях к файлам Windows! И ты даже забыл пространство внутри пути! Только абсолютные пути?