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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Regex для строки HTML таблицы с подтаблицами 
:(
    Опции темы
Dims
Дата 27.11.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 0
Всего: 11



У меня есть HTML таблица, внутри ячеек которой иногда бывают ещё вложенные таблицы.

Я предположил, что нижеслежующее выражение позволит опознать внешний TD:

Код

<td.*?>(.*?(<table.*?>.*?</table>)*.*?)</td>


Поскольку квантор после внутренних скобок "жадный", я подумал, что он обязательно съест таблицу внутри внешнего TD, если она там есть.

Однако, у меня почему-то внутренние скобки не получают соответствия, а сопоставление заканчивается на </td></tr> внутренней таблицы.

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


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


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

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



Цитата(Dims @  27.11.2009,  14:29 Найти цитируемый пост)
Я предположил, что нижеслежующее выражение позволит опознать внешний TD:
Думаю это надо сделать как-то так(не проверял).
Код

(?<tdstart><td\s[^>]*>)[.\n]*(?<tdend-tdstart></td\s*>)



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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 0
Всего: 11



А что значить вопросик в начале скобок? И что такое tdstart и tdend? Просто условные обозначения?
PM MAIL   Вверх
diadiavova
Дата 28.11.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Dims @  27.11.2009,  21:44 Найти цитируемый пост)
А что значить вопросик в начале скобок?

Это именованная группа. 
Цитата(Dims @  27.11.2009,  21:44 Найти цитируемый пост)
И что такое tdstart и tdend? 
Имена групп. При чём запись (?<tdend-tdstart></td\s*>) описывает сбалансированную пару. То есть группа tdend описана как завершающая группу tdstart. В данном случае имена используются для того, чтобы можно было обратиться к ним в самом выражении, но в принципе есть и другие применения, например группу можно извлечь по имени в программном коде.

Приведу пример работы сбалансированных парю Возьмём текст
Код

1 * (2  + 3 / (4 - 5)) - 6* (7 +8)

И разберём его выражением, которое берёт текст в скобках
При жадном разборе 
Код

\(.*\)
Мы очевидно получим такой результат
Код

(2  + 3 / (4 - 5)) - 6* (7 +8)
При ленивом 
Код

\(.*?\)
 такой
Код

(2  + 3 / (4 - 5)
А если будем искать сбалансированные пары скобок
Код

(?<parOp>\().*(?<parCl-parOp>\))
результат будет таким
Код

(2  + 3 / (4 - 5))
(7 +8)



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


Шустрый
*


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

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



Можно пример таблицы (желательно двух вариантов, вложенной и нет) и что Вам нужно получить (просто ее выделить, либо выделить данные из ячеек).
PM MAIL   Вверх
Lihonosov
Дата 29.3.2010, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть много строк такого содержания:
Код

...
<b class="cu">1</b>
<i class="cv" style="background-position:0 0"></i>
<a class="cs" tabindex="2" href="http://www.link-1.com/"></a>
....
<b class="cu">2</b>
<i class="cv" style="background-position:0 -16px"></i>
<a class="cs" tabindex="2" href="http://www.link-2.com"></a>
...

Нужно получить: 
1 - http://www.link-1.com
2 - http://www.link-2.com

Написал для каждой строки:
Код

(?'top'(?<=(\<b\ class\=\"cu\"\>))(\d{1,2})(?=(\<\/b\>[\n\r]?)))

(?'mid'(\<i\ class\=\"cv\"\ style\=\"background\-position\:\d{1,5}\s?\-?\d{1,5}(px)?\"\>\</i\>[\n\r]?))

(?'link'(?<=(\<a\ class\=\"cs\"\ tabindex\=\"2\"\ href\=\"))(https?://(www.)?([\w\-]+)(\.([\w\-]+))+([\w\\\/\.?&%=\-+]*[\n\r]?)))


Вывожу в коде так: 
Код

Regex r = new Regex(myRegex);
MatchCollection mc = r.Matches(sourceText);
listBox1.BeginUpdate();
foreach (Match m in mc)
{
       listBox1.Items.Add(m.Groups["top"] + " - "  + m.Groups["link"]);   
}
listBox1.EndUpdate();

Если подставлять по одному запросу, т.е. например, только :
Код

(?'top'(?<=(\<b\ class\=\"cu\"\>))(\d{1,2})(?=(\<\/b\>[\n\r]?)))

то все нормально. как и хотелось выводится 1,2,...
Также и по остальным.
Но как сделать чтобы сразу выводились и 'top' и 'link'?

Это сообщение отредактировал(а) Lihonosov - 29.3.2010, 03:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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