Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2016, 21:20   #1
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию Слишком длинное регулярное выражение

Добрый день!

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

Код:
<tr.+?>.+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>).+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>).+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>).+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>).+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>).*?</tr>
оно рабочие, но слишком длинное, выдает ошибку:

Цитата:
E2056 String literals may have at most 255 elements
как его можно оптимизировать ?

Вот код блока:

Код:
<tbody>
		<tr class="one">
			<td><a href="/player/" class="bold">2016</a></td>
			<td class="bold">32/17</td>
			<td><a href="/player/" class="bold">14/5</a></td>
			<td><a href="/player/" class="bold">9/7</a></td>
			<td><a href="/player/" class="bold">2/2</a></td>
			<td><a href="/player/" class="bold">7/3</a></td>
			<td>-</td>
		</tr>
		<tr class="two">
			<td><a href="/player/">2015</a></td>
			<td>52/29</td>
			<td><a href="/player/">17/9</a></td>
			<td><a href="/player/">28/15</a></td>
			<td><a href="/player/">6/4</a></td>
			<td><a href="/player/">1/1</a></td>
			<td>-</td>
		</tr>
		<tr class="one">
			<td><a href="/player/">2014</a></td>
			<td>51/20</td>
			<td><a href="/player/">30/14</a></td>
			<td><a href="/player/">21/6</a></td>
			<td>-</td>
			<td>-</td>
			<td>-</td>
		</tr>
		<tr class="two">
			<td><a href="/player/">2013</a></td>
			<td>51/23</td>
			<td><a href="/player/">43/13</a></td>
			<td><a href="/player/">8/8</a></td>
			<td><a href="/player/">0/2</a></td>
			<td>-</td>
			<td>-</td>
		</tr>
		<tr class="one">
			<td><a href="/player/">2012</a></td>
			<td>41/29</td>
			<td><a href="/player/">22/17</a></td>
			<td><a href="/player/">19/12</a></td>
			<td>-</td>
			<td>-</td>
			<td>-</td>
		</tr>
		<tr class="two">
			<td><a href="/player/">2011</a></td>
			<td>18/10</td>
			<td><a href="/player/">13/6</a></td>
			<td><a href="/player/">5/4</a></td>
			<td>-</td>
			<td>-</td>
			<td>-</td>
		</tr>
		<tr class="one">
			<td><a href="/player/">2010</a></td>
			<td>17/10</td>
			<td><a href="/player/">16/9</a></td>
			<td><a href="/player/">1/1</a></td>
			<td>-</td>
			<td>-</td>
			<td>-</td>
		</tr>
		<tr class="two">
			<td><a href="/player/">2009</a></td>
			<td>0/3</td>
			<td><a href="/player/">0/3</a></td>
			<td>-</td>
			<td>-</td>
			<td>-</td>
			<td>-</td>
		</tr>
	</tbody>
nibufep вне форума Ответить с цитированием
Старый 12.07.2016, 21:33   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Разбей на две строковые константы: 'бла-бла-1'+'бла-бла-2'. Или на сколько там, каждая не длиннее 255
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 12.07.2016 в 21:36.
Аватар вне форума Ответить с цитированием
Старый 12.07.2016, 21:38   #3
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

пробовал, так не работает.
nibufep вне форума Ответить с цитированием
Старый 12.07.2016, 21:43   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Покажи как пробовал
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.07.2016, 21:48   #5
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Код:
re.Expression := '<tr.+?>.+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>).+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>).+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>).+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>)' + '.+?(<td.*?><a.+?>(.*?)</a></td>|<td.*?>(.*?)</td>).*?</tr>';
nibufep вне форума Ответить с цитированием
Старый 12.07.2016, 21:53   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Выкинь это и возьми нормальный парсер HTML.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.07.2016, 23:09   #7
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Выкинь это и возьми нормальный парсер HTML.
А какой по вашему нормальный парсер?
nibufep вне форума Ответить с цитированием
Старый 12.07.2016, 23:41   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не знаю, не пишу на Дельфи.
Например что-то, что умеет XPath или CSS-подобные запросы.

Если нету, то значит язык плохо подходит для таких задач и лучше взять другой.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 12.07.2016 в 23:44.
Alex11223 вне форума Ответить с цитированием
Старый 13.07.2016, 00:20   #9
GreyScall
Пользователь
 
Аватар для GreyScall
 
Регистрация: 01.01.2011
Сообщений: 29
По умолчанию

Зависит от версии Делфи и от целей. Для простого получения данных из DOM сойдёт и TWebBrowser.
А разбирать HTML регулярными выражениями просто бессмысленно. Они абсолютно не рассчитаны на такое.
Regards, GreyScall.
GreyScall вне форума Ответить с цитированием
Старый 13.07.2016, 13:10   #10
Igor[Игорь]
Пользователь
 
Аватар для Igor[Игорь]
 
Регистрация: 25.11.2011
Сообщений: 52
По умолчанию

делай не за раз, а по шагам.
за 1 шаг выделяй <tr .. /tr>
за 2 шаг <td .. /td>
за 3 <a .. /a>
e-mail: igor23dec@yandex.ru , ICQ: 2168364 , Telegram: @IgorVN
Delphi, PHP
Примеры http://igorvn.ucoz.ru/
Igor[Игорь] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярное выражение Predator199 PHP 0 22.11.2015 15:29
Регулярное выражение nibufep Общие вопросы Delphi 3 24.01.2015 23:39
Регулярное выражение sanek_da Помощь студентам 0 23.11.2013 17:17
Регулярное выражение flame33 PHP 0 27.09.2011 12:56
Регулярное выражение Arassir PHP 4 16.03.2011 09:42