найти строку с помощью c #?

#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’.