#c# #asp.net #vb.net
#c# #asp.net #vb.net
Вопрос:
Я пытаюсь найти строку в строке ниже.
http://example.com/TIGS/SIM/Lists/Team Discussion/DispForm.aspx?ID=1779
с помощью http://example.com/TIGS/SIM/Lists
string . Как я могу получить Team Discussion
из нее слово?
Иногда строки будут
http://example.com/TIGS/SIM/Lists/Team Discussion/DispForm.aspx?ID=1779
I need `Team Discussion`
http://example.com/TIGS/ALIF/Lists/Artifical Lift Discussion Forum 2/DispForm.aspx?ID=8
I need `Artifical Lift Discussion Forum 2`
Комментарии:
1. Немного другой подход; загрузите его в a
Uri
и используйтеParts
свойство.
Ответ №1:
Если вы всегда следуете этому шаблону, я рекомендую ответ @Justin. Однако, если вам нужен более надежный метод, вы всегда можете связать методы System.Uri
and Path.GetDirectoryName
, а затем выполнить a String.Split
. Как в этом примере:
String url = @"http://example.com/TIGS/SIM/Lists/Team Discussion/DispForm.aspx?ID=1779";
System.Uri uri = new System.Uri(url);
String dir = Path.GetDirectoryName(uri.AbsolutePath);
String[] parts = dir.Split(new[]{ Path.DirectorySeparatorChar });
Console.WriteLine(parts[parts.Length - 1]);
Однако единственная серьезная проблема заключается в том, что вы получите путь, который был «закодирован» (т. Е. Ваше пространство теперь будет представлено a
)
Ответ №2:
Это решение предоставит вам последний каталог вашего URL-адреса, независимо от того, сколько каталогов в вашем URL.
string[] arr = s.Split('/');
string lastPart = arr[arr.Length - 2];
Вы могли бы объединить это решение в одну строку, однако для этого потребуется разделить строку дважды, один раз для значений, второй для длины.
Ответ №3:
Если вы хотите увидеть пример регулярного выражения:
string input = "http://example.com/TIGS/SIM/Lists/Team Discussion/DispForm.aspx?ID=1779";
string given = "http://example.com/TIGS/SIM/Lists";
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(given @"/(. )/");
System.Text.RegularExpressions.Match match = regex.Match(input);
Console.WriteLine(match.Groups[1]); // Team Discussion
Ответ №4:
Вот простой подход, предполагающий, что ваш URL-адрес всегда имеет одинаковое количество косых черт перед нужным вам:
var value = url.Split(new[]{'/'}, StringSplitOptions.RemoveEmptyEntries)[5];
Ответ №5:
Вот еще одно решение, которое обеспечивает следующие преимущества:
- Не требует использования регулярных выражений.
- Не требует наличия определенного «количества» косых черт (индексация на основе определенного числа). Я считаю это ключевым преимуществом, потому что это снижает вероятность сбоя кода при изменении какой-либо части URL. В конечном счете, лучше всего основывать свою логику синтаксического анализа на том, какая часть структуры текста, по вашему мнению, с наименьшей вероятностью изменится.
Однако этот метод основан на следующих предположениях, которые я считаю наименее вероятными для изменения:
- URL должен содержать «/Lists/» прямо перед целевым текстом.
- URL должен содержать «/» сразу после целевого текста.
По сути, я просто разделяю строку дважды, используя текст, который, как я ожидаю, будет окружать интересующую меня область.
String urlToSearch = "http://example.com/TIGS/SIM/Lists/Team Discussion/DispForm.aspx";
String result = "";
// First, get everthing after "/Lists/"
string[] temp1 = urlToSearch.Split(new String[] { "/Lists/" }, StringSplitOptions.RemoveEmptyEntries);
if (temp1.Length > 1)
{
// Next, get everything before the first "/"
string[] temp2 = temp1[1].Split(new String[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
result = temp2[0];
}
Затем ваш ответ будет сохранен в переменной ‘result’.