Регулярные выражения и относительные пути к файлам - PullRequest
4 голосов
/ 29 октября 2008

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

Спасибо, David

Ответы [ 4 ]

13 голосов
/ 29 октября 2008

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

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

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

3 голосов
/ 29 октября 2008

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

2 голосов
/ 29 октября 2008

Как насчет:

"([^/]+)/?$"
  • 1 или более не / символов
  • Дополнительно /
  • Конец строки

Но, как говорит @ Блер Конрад , лучше пойти с классом, который инкапсулирует это для вас ...

1 голос
/ 29 октября 2008

Согласен с ответами "не делай так", но, поскольку он помечен как "регулярное выражение" ...

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