2008-10-29 3 views
4

Я пытаюсь сопоставить имя папки в относительном пути с помощью C#. Я использую выражение: "/(.*)?/" и реверсирование соответствия слева направо налево. Когда я передаю "images/gringo/" в регулярное выражение, он правильно дает мне "gringo" в первой группе - меня интересует только то, что находится между скобками. Когда я перехожу в "images/", он не может забрать "images". Я пробовал использовать [/^] и [/$], но не работает.Регулярные выражения и относительные пути к файлам

Спасибо, David

+0

Регулярное выражение не всегда является ответом! в этом случае библиотеки, предоставляемые инструментами, намного проще! :) – warren 2008-10-29 14:01:34

ответ

13

Вы, вероятно, лучше использовать System.IO.DirectoryInfo класс интерпретировать ваш относительный путь. Вы можете обрывать имена папок и файлов с помощью своих членов:

DirectoryInfo di = new DirectoryInfo("images/gringo/"); 
Console.Out.WriteLine(di.Name); 

Это будет гораздо безопаснее, чем любые регулярные выражения вы можете использовать.

3

Не делайте этого. Используйте System.IO.Path, чтобы разбить части пути, а затем сравнить их.

2

Как насчет:

"([^/]+)/?$" 
  • 1 или более NON/символов
  • факультативных/
  • Конец строки

Но @Blair Conrad говорит - лучше ехать с классом который инкапсулирует это для вас ....

1

Согласовано с «не делать это таким образом» ответы, но, так как это помечено «регулярное выражение» ...

  • Вам не нужно ?. * уже принимает 0 повторений в качестве совпадения, поэтому (. *) в точности эквивалентен (. *)?
  • Вы редко на самом деле хотите использовать . * во всяком случае. Если вы пытаетесь захватить то, что находится между двумя косыми чертами, используйте /([^ /] *)/, иначе тестирование против «foo/bar/baz /» будет (в большинстве реализаций регулярных выражений), возвратит единственное соответствие для «bar/baz» вместо соответствия «bar» и «baz» отдельно.
Смежные вопросы