Извлеките часть этих URL-адресов с помощью регулярных выражений и c#

#c# #regex

#c# #регулярное выражение

Вопрос:

Я должен проверить, соответствуют ли эти два URL шаблону (или 2, если быть более точным). Если это так, я хотел бы извлечь некоторую часть данных.

1) /selector/en/any-string-chain-you-want.aspx?FamiId=32

Затем мне нужно извлечь «en» и «32» в переменные. Для меня выражение regex должно выглядеть примерно как /selector/{0}/any-string-chain-you-want.aspx?FamiId={1}

2) /selector/en/F/ 32/any-string-chain-you-want.html

где en и 32 должны быть присвоены переменным. Итак: /selector/{0}/F/{1}/any-string-chain-you-want.html

{0}: двухбуквенный код языка, такой как en, fr, nl, es, … {1}: целые числа идентификатора семейства (2 или 3 числа), такие как 12, 38, 124 и т.д., Но не 1212

Есть идеи о том, как этого добиться?

Заранее спасибо,

Roland

Ответ №1:

Это регулярное выражение:

 /selector/([a-z]{2})/. ?.aspx?FamiId=([0-9] )
  

Код:

 var regex = new Regex(@"/selector/([a-z]{2})/. ?.aspx?FamiId=([0-9] )");
var test = "/selector/en/any-string-chain-you-want.aspx?FamiId=32";

foreach (Match match in regex.Matches(test))
{
    var lang = match.Groups[1].Value;
    var id = Convert.ToInt32(match.Groups[2].Value);

    Console.WriteLine("lang: {0}, id: {1}", lang, id);
}
  

Регулярное выражение для второго случая: /selector/([a-z]{2})/F/([0-9] )/. ?.html (код не меняется)

Ответ №2:

Вам следует ознакомиться с этим руководством по регулярным выражениям.

Вы могли бы использовать следующие выражения:

 /selector/([a-z]{2})/.*.aspx?FamiId=([0-9]{2,3})
  

и

 /selector/([a-z]{2})/F/([0-9]{2,3})/.*.html
  

Ответ №3:

Вы можете попробовать с:

 ^/.*?/(w{2})/(?:F/|.*?FamiId=)(d{2,3}).*$
  

Это работает для обоих URL-адресов.

Ответ №4:

Пример 1

 private const string Regex1 = @"/selector/(ww)/. .aspx?FamiId=(d )";
  

Случай 2

 private const string Regex2 = @"/selector/(ww)/F/(d )/. .html";
  

Использование

 Match m = Regex.Match(myString, Regex2);
string lang = m.Groups[1].Value;
string numericValue = m.Groups[2].Value;
  

Ответ №5:

 string str = @"/selector/en/any-string-chain-you-want.aspx?FamiId=32";
Match m = Regex.Match(str, @"/selector/(w{2})/. .aspx?FamiId=(d{2,3})");
string result = String.Format(@"/selector/{0}/F/{1}/any-string-chain-you-want.html", m.Groups[1].Value, m.Groups[2].Value);
  

Вот так.

Ответ №6:

Полезно немного изучить регулярные выражения для подобных случаев. RegExr — это бесплатный онлайн-инструмент для создания регулярных выражений. Однако наиболее полезным, что я нашел, является Expresso

Ответ №7:

вы можете использовать что-то вроде этого

 String urlSchema1= @"/selector/(<lang>ww)/. .aspx?FamiId=(<FamiId>d )";

Match mExprStatic = Regex.Match(inputString,urlSchema1, RegexOptions.IgnoreCase | RegexOptions.Singleline);
 if (mExprStatic.Success || !string.IsNullOrEmpty(mExprStatic.Value))
 {
    String language = mExprStatic.Groups["lang"].Value;
    String FamId = mExprStatic.Groups["FamId"].Value;
 }

String urlSchema2= @"/selector/(<lang>ww)/F/(<FamId>d )/. .html";

Match mExprStatic = Regex.Match(inputString,urlSchema2, RegexOptions.IgnoreCase | RegexOptions.Singleline);
 if (mExprStatic.Success || !string.IsNullOrEmpty(mExprStatic.Value))
 {
    String language = mExprStatic.Groups["lang"].Value;
    String FamId = mExprStatic.Groups["FamId"].Value;
 }