Стиль RegEX для HTML-кода - PullRequest
       1

Стиль RegEX для HTML-кода

0 голосов
/ 04 апреля 2011

Привет всем, какой будет код regEX для следующего:

<br/><span class=""synopsis-view-synopsis"">America's justice system comes under indictment in director <a href='/people/1035' class='actor' style='font-weight:bold'>Norman Jewison</a>'s trenchant film starring <a href='/people/1028' class='actor' style='font-weight:bold'>Al Pacino</a> as upstanding attorney Arthur Kirkland. A hard-line -- and tainted -- judge (<a href='/people/1034' class='actor' style='font-weight:bold'>John Forsythe</a>) stands accused of rape, and Kirkland (<a href='/people/1028' class='actor' style='font-weight:bold'>Al Pacino</a>) has to defend him. Kirkland has a history with the judge, who jailed one of the lawyer's clients on a technicality. When the judge confesses his guilt, Kirkland faces an ethical and legal quandary. </span>

Я пробовал это:

regex = New System.Text.RegularExpressions.Regex("(?<=""synopsis-view-synopsis""\>)([^<\/span><]+)")

Но это, кажется, только первая часть описания; Americ

Любая помощь будет отличной! : О)

David

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Я не вижу здесь никакой необходимости смотреть вперед или смотреть назад; просто сопоставьте весь элемент <span> и используйте группу захвата, чтобы извлечь его содержимое. Предполагая, что никогда не будет элементов <span> внутри того, который вы подходите, это все, что вам нужно:

Regex rgx = new Regex(
    @"<span\s+class=""synopsis-view-synopsis"">(.*?)</span>",
    RegexOptions.IgnoreCase | RegexOptions.Singleline);

foreach (Match m in rgx.Matches(s0))
{
  Console.WriteLine(m.Groups[1].Value);
}

Кроме того, [^<\/span><]+ не делает то, о чем вы, вероятно, думаете. У вас есть класс символов , который соответствует любому одному символу, кроме <, /, s, p, a, n или > , Возможно, вы пытались это сделать:

(?:(?!</span>).)+

... который соответствует одному символу за раз, после . Взгляд в будущее подтверждает, что символ не является началом последовательности </span>. Это правильная техника, но (как и в случае с внешностью), я не думаю, что вам здесь нужно что-то настолько необычное.

0 голосов
/ 04 апреля 2011

в .net существуют разные методы для «сопоставления» и «сопоставления всем»:

re.Match(str);   // regex 're' match in string 'str'
re.Matches(str)  // regex 're' matches all in string 'str' 

обновление

Объяснение для регулярного выражения

  • (?<=regex) - положительный взгляд назад
  • (?!regex) - отрицательный взгляд
  • .+ окончательно сопоставляет что-либо между поискомШаблон совпадения:
    (?<=""synopsis-view-synopsis""\>).+(?!</span>)
    

    C # .NET Пример кода:

    using System;
    using System.Text.RegularExpressions;
    namespace myapp
    {
      class Class1
        {
          static void Main(string[] args)
            {
              String sourcestring = 
                "<br/><span class=""synopsis-view-synopsis"">America's justice... </span>
                 <br/><span class=""synopsis-view-synopsis"">Canada's justice... </span>";
    
              Regex re = new Regex(@"(?<=""""synopsis-view-synopsis""""\>).+(?!</span>)");
              MatchCollection mc = re.Matches(sourcestring);
              int mIdx=0;
              foreach (Match m in mc)
               {
                for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
                  {
                    Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
                  }
                mIdx++;
              }
            }
        }
    }
    

    Найдено совпадений:

    [0][0] = America's justice... </span>
    [1][0] = Canada's justice... </span>
    
0 голосов
/ 04 апреля 2011
(?=""synopsis-view-synopsis""\>).+(?!<\/span>)

Вероятно, должно работать. Попробуйте вместо этого использовать анализатор HTML!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...