На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Помогите составить регулярное выражение
    Помогите составить регулярное выражение

    Для HTML страницы надо получить текст между тегом
    ExpandedWrap disabled
      <p class=”intro”>НАДО ЭТО ПРОЧИТАТЬ</p>


    Получилось че-то типа
    ExpandedWrap disabled
      string  reg_exp = @"(?<=\s*<\s*p\s*class=";
                      reg_exp += "\"intro\"";
                      reg_exp += @">)[\S\s]*</p>";

    Но ессно, работает не так как надо.
      можешь воспользоваться таким выражением
      ExpandedWrap disabled
        <p.*>(?'text'.*)</p>

      А потом получить Matches и из него Groups ;)

      Добавлено
      должно быть где-то так:
      ExpandedWrap disabled
        const string parseStr = "<p.*>(?'text'.*)</p>";
        string matchStr= "<p class=”intro”>НАДО ЭТО ПРОЧИТАТЬ</p>";
        Regex rx = new Regex(parseStr , RegexOptions.Compiled );
        foreach(Match match in rx.Matches(matchStr))
        {
            MessageBox.Show(match.Groups["text"].Value);
        }

      PS писал от руки, так что могут быть ошибки
      Сообщение отредактировано: GarF1eld -
        Цитата GarF1eld @
        можешь воспользоваться таким выражением

        1)Содержание тега <p class="intro"> таково:
        ExpandedWrap disabled
          <p class="intro"> Бла - Бла Бла ..... </p>

        Все нормально, он оно находит также и закрывающийся </p>, а он не нужен.
        А 'text' - это что - параметр?
        2)А вот еще тег, с которым проблемы
        ExpandedWrap disabled
          <div class="text">
                           <p> <b>5353535
          543  53 Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла</b><br />
                            БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапосле этого женщины плачут и говорят: «Он переспал со мной, он меня бросил».
                          <p><b> Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла</b><br />
                            БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапос…
                          <p><b>Короче, полно всяких левых тегов и переносов строк.</b><br />
                            Может быть. Может быть…
                          <p><b>Лялялялял ЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялял
          ялялялял</b></P>
          <div>

        Короче, полно всяких левых тегов и переносов строк.
        Пробовал <div class="text">(?'textik'[.\n]*)</div> - все равно ниче нет.
          Так что конкретно нужно, чтоб парсило? Я не пойму...

          Добавлено
          если нужно просто убрать все теги, то используй
          <.*>
          и заменяй их на пустую строку

          У меня из такого
          ExpandedWrap disabled
            <div class="text">
                             <p> <b>5353535
            543  53 Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла</b><br />
                              БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапосле этого женщины плачут и говорят: «Он переспал со мной, он меня бросил».
                            <p><b> Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла</b><br />
                              БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапос…
                            <p><b>Короче, полно всяких левых тегов и переносов строк.</b><br />
                              Может быть. Может быть…
                            <p><b>Лялялялял ЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялял
            ялялялял</b></P>
            <div>

          получилось так:
          ExpandedWrap disabled
                             5353535
            543  53 Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла
                              БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапосле этого женщины плачут и говорят: «Он переспал со мной, он меня бросил».
                            
                              БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапос…
                            
                              Может быть. Может быть…
                            Лялялялял ЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялял
            ялялялял

          :unsure:

          Добавлено
          или можешь использовать два Regex =) Один, чтоб нашел необходимый текст, другой, чтоб заменял. А с лишними пробелами можешь сделать следующее:
          1) представить ответ как массив строк(через srting.Split)
          2) Обрезать ненужные пробелы. (string.Trim())
          3) Склеить строку обратно.

          В общем, все зависит от потребностей
            1) Мне нужно прочитать из <p class=”intro”>НАДО ЭТО ПРОЧИТАТЬ</p> - здесб нормально, проблем т к весь текст находиться на одной строке и в нем нет других тегов (например, если бы были <p></p>, то регулярное выражение "узнает" до какого именно </p> надо прочитать?)

            2) Мне нужно прочитать из <div class="text"> Прочитать, тут дофига всего, в том числе переводов строк и других тегов тегов </div>. Внутри этого текста может быть вложенные теги div. Тогда как регулярное выражение (<div.*>(?'text'.*)</div>) "узнает" до какого именно </div> надо прочитать?
            Например

            <div class="text"> fdsfsfd fdsf fds fds

            fds fdfs ffffffff <div> fdddddddddd<p> dsada dsa45-305 </p>
            Цитата GarF1eld @
            Так что конкретно нужно, чтоб парсило? Я не пойму..

            54354 543543 </div> <!-- Может оно прочитат до этих пор -->
            dfsa 43444444444 <div class="text2> dsd 453543
            </div> <!-- А может и до сюда -->

            </div> <!-- Но надо-то прочиать до этого места -->

            Для тех, кто в танке - [COLOR=red]НАДО ПРОЧИАТЬ ВСЕ, ЧТО НАХОДИТЬСЯ МЕЖДУ ОТКРЫВАЮЩИСЯ <DIV CLASS="TEXT"> И СООТВЕТСТВУЮЩИМ ЕМУ ЗАКРЫВАЮЩИМСЯ </DIV>

            Кстати, имхо <div.*>(?'text'.*)</div> переводы строк обрабатывать не будет, хотя они есть в тексте между этими тегами
              Чтоб обрабатывались переводы строк, в конструкторе RegexOptions.Multiline.
                Может проще будет загрузить это все в XmlDocument? Если сайт xhtml конечно....

                Добавлено
                вот файл 1.htm
                ExpandedWrap disabled
                  <div id="UpdatePanel1">
                      <div id="Panel2" style="width:125px;">
                          <div><input type="submit" name="Button1" value="Button" id="Button1" /></div>
                          <div><select size="4" name="ListBox1" id="ListBox1"></select></div>
                      </div>
                      <input type="submit" name="Button2" value="Button" id="Button2" />
                  </div>

                Вот код
                ExpandedWrap disabled
                              XmlDocument doc = new XmlDocument();
                              doc.Load(@"d:\1.htm");
                              foreach (XmlNode node in doc.SelectNodes("//div"))
                              {
                                  MessageBox.Show(node.InnerXml);
                              }

                и все ;)
                  Цитата GarF1eld @
                  Может проще будет загрузить это все в XmlDocument? Если сайт xhtml конечно.
                  Сайт не xhtml
                    Регулярными выражениями в силу особенностей их реализации невозможно правильно обрабатывать сбалансированость открывающих/закрывающих элементов. Обратись в сторону синтаксического анализа.

                    А вообще, если нужно обрабатывать только указанный формат строк, проще написать код для разборки вручную - скорее всего он будет быстрее РВ
                      Тогда всем спасибо, буду дальше мучиться.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0364 ]   [ 16 queries used ]   [ Generated: 5.05.24, 03:43 GMT ]