Регулярное выражение для использования, которое соответствует тексту до .html и после / - PullRequest
1 голос
/ 12 июня 2010

С этой строкой

http://sfsdf.com/sdfsdf-sdfsdf/sdf-as.html

Мне нужно получить sdf-as

с этим

hellow-1/yo-sdf.html

Мне нужно yo-sdf

Ответы [ 5 ]

3 голосов
/ 12 июня 2010

Есть много способов сделать это. Следующее использует обходные пути, чтобы соответствовать только части имени файла. Это на самом деле не позволяет /, если это так:

string[] urls = {
   @"http://sfsdf.com/sdfsdf-sdfsdf/sdf-as.html",
   @"hellow-1/yo-sdf.html",
   @"noslash.html",
   @"what-is/this.lol",
};

foreach (string url in urls) {
   Console.WriteLine("[" + Regex.Match(url, @"(?<=/|^)[^/]*(?=\.html$)") + "]");
}

Это печатает:

[sdf-as]
[yo-sdf]
[noslash]
[]

Как работает шаблон

3 части:

  • (?<=/|^): позитивный взгляд, подтверждающий, что перед нами стоит косая черта /, или мы находимся в начале строки
  • [^/]*: сопоставить что угодно, кроме косой черты
  • (?=\.html$): позитивный взгляд на то, что за нами следует ".html" (буквально на точке)

Ссылки


Альтернатива без регулярных выражений

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

static String getFilename(String url, String ext) {
   if (url.EndsWith(ext)) {
     int k = url.LastIndexOf("/");
     return url.Substring(k + 1, url.Length - ext.Length - k - 1);
   } else {
     return "";
   }
}

Тогда вы бы назвали это:

getFilename(url, ".html")

API ссылки


Вложения

3 голосов
/ 12 июня 2010

Это должно получить то, что вам нужно:

Regex re = new Regex(@"/([^/]*)\.html$");
Match match = re.Match("http://sfsdf.com/sdfsdf-sdfsdf/sdf-as.html");
Console.WriteLine(match.Groups[1].Value); //Or do whatever you want with the value

Для работы требуется using System.Text.RegularExpressions; вверху файла.

1 голос
/ 12 июня 2010

Попробуйте это:

string url = "http://sfsdf.com/sdfsdf-sdfsdf/sdf-as.html";
Match match = Regex.Match(url, @"/([^/]+)\.html$");
if (match.Success)
{
    string result = match.Groups[1].Value;
    Console.WriteLine(result);
}

Результат:

sdf-as

Однако было бы лучше использовать класс System.URI для анализа строки, чтобы вы правильно обрабатывали такие вещи, как http://example.com/foo.html?redirect=bar.html.

0 голосов
/ 12 июня 2010

Это делает необязательные части косой черты и точки и позволяет файлу иметь любое расширение:

new Regex(@"^(.*/)?(?<fileName>[^/]*?)(\.[^/.]*)?$", RegexOptions.ExplicitCapture);

Но я все еще предпочитаю Substring (LastIndexOf (...))потому что это гораздо более читабельно.

0 голосов
/ 12 июня 2010
using System.Text.RegularExpressions;
Regex pattern = new Regex(".*\/([a-z\-]+)\.html");
Match match = pattern.Match("http://sfsdf.com/sdfsdf-sdfsdf/sdf-as.html");
if (match.Success)
{
    Console.WriteLine(match.Value);
}
else
{
    Console.WriteLine("Not found :(");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...