2013-06-21 2 views
0

Во-первых, я потратил три часа, пытаясь решить эту проблему. Также, пожалуйста, не предлагайте не использовать регулярное выражение. Я ценю другие комментарии и могу легко использовать другие методы, но я практикую регулярное выражение как можно больше.Разбор каталогов из строки

Я использую VB.Net

Пример строки:

"Hello world this is a string C:\Example\Test E:\AnotherExample" 

Выкройка:

"[A-Z]{1}:.+?[^ ]*" 

работает отлично. Как бы то ни было, если имя каталога содержит пробел? Я попытался сопоставить все строки, которые начинаются с 1 заглавной буквы, за которой следует двоеточие, а затем что-то еще. Это нужно согласовать до пробела, 1 верхнюю букву и двоеточие. Но затем повторите ту же последовательность.

Надеюсь, у меня есть смысл.

+3

Должен ли он справиться с чем-то вроде: «Это строка C: \ program files \ test D: \ test, а это еще одна строка»? Потому что любые строки в конце были бы - насколько я могу судить, невозможно определить из каталога с пробелами. – Gray

+0

Вы спрашиваете невозможное. Предполагая, что эти пути относятся к локальной файловой системе, вам нужно будет последовательно тестировать более длинные кандидаты, чтобы убедиться, что они являются каталогами ... иначе нет возможности разрешить неоднозначность последовательных слов, которые являются или не являются частью пути. – spender

ответ

0

Как насчет "[A-Z] {1}: ((?! [A-Z] {1}:).) *", Который должен остановиться перед следующей буквой диска и двоеточием?

Это "?!" является «негативным обратным знаком» или «отрицательным обратным знаком с нулевой шириной», который, согласно Regular expression to match a line that doesn't contain a word?, является способом обойти отсутствие обратного соответствия в регулярных выражениях.

+0

... на самом деле, Регулятор Роя Ошерова (http://www.webresourcesdepot.com/learn-test-regular-expressions-with-the-regulator/) говорит мне, что приведенное выше будет соответствовать буквам диска, но ничего кроме , которые я не совсем понимаю на данный момент. – Jon

+0

ах! Мне не хватало точки! Ответ обновлен ... – Jon

+0

... и, конечно же, @Gray правильно, что любые последующие слова будут считаться частью последнего пути. Пути, содержащие пробелы, часто ограничиваются цитатой только по этой причине - пробел в пути к файлу неотличим от пробела после пути файла :-) – Jon

0

не быть слишком придирчивым, но большинство файловых систем запретить небольшое количество символов (как <>/\ :? "), так что правильный шаблон для пути к файлу будет больше похож [A-Z]:\\((?![A-Z]{1}:)[^<>/:?"])*.

Другой Важным моментом, который был поднят, является то, как вы ожидаете анализировать входные данные, такие как «hello path is c: \ folder \ file.extension, это не часть пути: P»? Это проблема, с которой вы обычно сталкиваетесь, когда начинаете пытаться синтаксический анализ без указания допустимого диапазона входных данных или грамматики, которую принимает парсер. Эта конкретная проблема кажется довольно ad hoc, и поэтому я не ожидаю, что вы придумаете грамматику или определите, как кодируются конкретные сообщения. в следующий раз, когда вы подходите к проблеме синтаксического анализа, посмотрите, можете ли вы сначала определить, что m разрешены и что они означают (синтаксис и семантика). Я думаю, вы обнаружите, что после того, как вы определили структуру разрешенных сообщений, синтаксический анализ может быть почти тривиальным.

Смежные вопросы