Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Группы в регулярных выражениях 
:(
    Опции темы
i2m
Дата 4.5.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 4.5.2010

Репутация: нет
Всего: 1



Здравствуйте, уже спрашивал этот вопрос на другом форуме но так и не дождался ответа... В общем есть 2 таблицы

Код

<tr>
<td>LocalHit</td> 
<td style="text-align: right;">63852,00</td>
<td style="text-align: right;">86804,70</td>
<td style="text-align: right;">0,00</td>
</tr>

<tr>                                        
<td>Входящий трафик ADSL8192</td>
<td style="text-align: right;">94598,26</td>
<td style="text-align: right;">0,00</td>
</tr>


Для них нужно составить универсальное регулярное выражение, т.е что бы подходило и под первую таблицу и под вторую, я составил вот такую регулярку:

Код

<tr>\\s+<.*>(?:Входящий трафик (.*)|(.*))</td>\\s+<.*>(.*)</td>\\s+(?:<.*>(.*)</td>\\s+</tr>|<.*>(.*)</td>\\s+<.*>(.*)</td>\\s+</tr>)


Потом я эти данные заношу в listview:

Код

            foreach (Match match in matches)
            {
                GroupCollection Groups = match.Groups;

                ListViewItem lvi = new ListViewItem();

                if (Groups[1].Value != "")
                    lvi.Text = Groups[1].Value;
                else
                    lvi.Text = Groups[2].Value;

                lvi.SubItems.Add(Groups[3].Value);
                lvi.SubItems.Add(Groups[5].Value);

                if (Groups[4].Value != "")
                    lvi.SubItems.Add(Groups[4].Value);
                else
                    lvi.SubItems.Add(Groups[6].Value);

                listView1.Items.Add(lvi);
            }


Но меня не устраивает что я должен делать проверки типа if (Groups[1].Value != "").
Вопрос, можно ли сделать это на уровне регулярного выражения, т.е что бы он уже возвращал нужное значение и тогда добавление в listview было бы таким:

Код

            foreach (Match match in matches)
            {
                GroupCollection Groups = match.Groups;

                ListViewItem lvi = new ListViewItem();

                lvi.Text = Groups["name"].Value;
                lvi.SubItems.Add(Groups["val1"].Value);
                lvi.SubItems.Add(Groups["val2"].Value);
                lvi.SubItems.Add(Groups["val3"].Value);

                listView1.Items.Add(lvi);
            }


Результат для первой таблице должен получиться таким

Код

Услуга       |Вход. трафик|Исх. трафик|Начислено
LocalHit        63852,00     86804,70    0,00


для второй 

Код

Услуга       |Вход. трафик|Исх. трафик|Начислено
ADSL8192        94598,26                 0,00


Уже бьюсь несколько дней ... 

Это сообщение отредактировал(а) i2m - 4.5.2010, 14:01
PM MAIL   Вверх
diadiavova
Дата 4.5.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(i2m @  4.5.2010,  14:56 Найти цитируемый пост)
Вопрос, можно ли сделать это на уровне регулярного выражения, т.е что бы он уже возвращал нужное значение 

Можно
http://msdn.microsoft.com/ru-ru/library/36xybswe(VS.90).aspx

Только рабирать хтмл регулярками - мазохизм.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
i2m
Дата 4.5.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 4.5.2010

Репутация: нет
Всего: 1



Ну вот если взять первую группу то по идеи тогда она должна выглядеть так:

Код

(?<name>(?=Входящий трафик .*)Входящий трафик .*|.*)


И должен возвращать просто "ADSL8192" а он возвращает "Входящий трафик ADSL8192" почему так?
PM MAIL   Вверх
diadiavova
Дата 4.5.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



i2m, если честно, я вообще не понял чего ты там намудрил. Твою задачу можно решить регулярками, но это гемор...всё-равно получится громоздко и сложно. И самая главная проблема, которая при этом возникает: если структура страницы немного изменится( а это, насколько я понимаю, не от тебя зависит) - твоя программа либо упадёт, либо тебе придётся предоставить пользователю чудную возможность самому переписать регулярку smile 
Твой пример посмотрел, тебе видимо лучше использовать не условия, а "положительное утверждение просмотра назад нулевой ширины" (?<=часть выражения). Внутри этой конструкции как раз описываешь заголовок, а следом, то, что надо получить. Как-то так
Код

(?<=<td\s+[^>]*>Входной трафик.*</td\s*>)(?# Здесь регулярка для входного трафика)
|(?# Здесь регулярка для LocalHit)
Как-то так. Не для копипасты ессно.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
i2m
Дата 4.5.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 4.5.2010

Репутация: нет
Всего: 1



diadiavova, Попробовал твой вариант не работает, а если не регулярками то чем? 
PM MAIL   Вверх
diadiavova
Дата 4.5.2010, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(i2m @  4.5.2010,  17:49 Найти цитируемый пост)
Попробовал твой вариант не работает

Я же написал "не для копипасты", то есть это и не было готовое решение, а просто идея как сделать.

Цитата(i2m @  4.5.2010,  17:49 Найти цитируемый пост)
а если не регулярками то чем?

sgmlreader распарсит веб-страницу в xml-документ, а потом делай с ним что хош: хоть через DOM данные извлекай, хоть через XPath, но лучше всего  - через XSLT, можно в случае чего и пользователю предоставить написание преобразования и даже несложный конструктор соорудить.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
i2m
Дата 4.5.2010, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 4.5.2010

Репутация: нет
Всего: 1



diadiavova, На счет регулярки, оказывается можно было просто вот так сделать.

Код

<tr>\\s+<.*>(?:Входящий трафик (?<name>.*)|(?<name>.*))</td>\\s+<.*>(?<val1>.*)</td>\\s+(?:<.*>(?<val3>.*)</td>\\s+</tr>|<.*>(?<val2>.*)</td>\\s+<.*>(?<val3>.*)</td>\\s+</tr>)


И все как нужно работает. А на счет xml буду копать в эту сторону, спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.