vika
|
|
« : 13-08-2012 18:43 » |
|
Здравствуйте. Вот никак понять не могу, как правильно обозначить подшаблон в шаблоне. То бишь, вот этот код не робит совсем, хотя отдельно куски могу вытащить #!/usr/bin/perl -w
$| = 1;
my $test = <<"EOF"; <table cellspacing="0" cellpadding="3" border="0" align="center" width="100%"> EOF
$test =~ m/cellspacing="(\d)\D+width="(\d+[^\"]+)/;
print $1;
print $2;
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #1 : 13-08-2012 19:24 » |
|
vika, а я вообще этого кода не пойму. Чего ищется? Парсинг атрибутов будет примерно так: /cellspacing="(\d*)"\s+.*width="(\d+.*)?"/
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #2 : 13-08-2012 21:09 » |
|
Согласен: задачу нужно описывать, а не вываливать свои потуги.
Дим, кстати, твое выражение с изъяном и "?" не понятно к чему. Сдается, ты скобку рано поставил.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #3 : 14-08-2012 05:33 » |
|
RXL, ко второй группе. Другое дело, что по принципу жадного алгоритма .* во второй группе отхватит не содержимое кавычек после width, а кусок от начальной кавычки width до самой последней кавычки в строке. И вот это проблема. Я на вскидку не помню, какие суффиксы после числа могут быть у width, кроме %.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #4 : 14-08-2012 05:52 » |
|
Пробелы могут быть. Шаблон следующий: "\s*(\d+)\s*%?\s*". При этом, если это не XHTML, то и кавычки могут быть опцией.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #5 : 14-08-2012 06:25 » |
|
RXL, не согласен. Ты из группы исключил суффикс, а это существенная информация - единица измерения.
Вообще атрибуты надо поштучно обрабатывать. Ведь их порядок тоже может быть произвольным.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #6 : 14-08-2012 09:01 » |
|
В HTML/XHTML нет суффиксов! Ты путаешь с CSS.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #7 : 14-08-2012 11:34 » |
|
RXL, как минимум там может быть число, или число с процентом. Вот это-то я точно не путаю.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #8 : 14-08-2012 13:31 » |
|
Совершенно верно. И шаблон в ответе 4 это учитывает.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #9 : 14-08-2012 15:01 » |
|
RXL, он это не учитывает постольку, поскольку тема про группы, про $1...$9. Ты же не поместил процент внутрь группы (скобок), т.е. при чтении группы ты не узнаешь, был ли там процент или не было, хотя в целом выражение будет распознано.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #10 : 14-08-2012 15:10 » |
|
В таком случае, предлагаю шаблон такого вида: "\s*(\d+)\s*(%)?\s*" Думаю, логичнее использовать две группы, чем проверять, есть ли в конце знак процента и нет ли пробелов.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #11 : 14-08-2012 15:26 » |
|
RXL, ну это уже зависит от задачи. Однако автор темы куда-то пропала.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
vika
|
|
« Ответ #12 : 15-08-2012 07:48 » |
|
В таком случае, предлагаю шаблон такого вида: "\s*(\d+)\s*(%)?\s*"
Не работает шаблон Добавлено через 33 секунды:RXL, ну это уже зависит от задачи. Однако автор темы куда-то пропала.
Так как все-таки вытаскивать из текста нужные куски???
|
|
« Последнее редактирование: 15-08-2012 07:48 от vika »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #13 : 15-08-2012 09:32 » |
|
$test =~ m/\scellspacing\s*=\s*"\s*(\d+)\s*"[^>]*\swidth\s*=\s*"\s*(\d+)\s*(%)?\s*"/;
print "$1\n\$2$3\n";
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
vika
|
|
« Ответ #14 : 15-08-2012 14:28 » |
|
Спасибо за пример. Но, хотелось бы услышать общие принципы. Что не читала, все или не работает, или очень заумно для понимания. Из того, что поняла =~m/(первое совпадение)\1 (второе совпадение)\2 ... (n-ное совпадение)\n/ Каждая скобка - подшаблон, \1 - локальная переменная, нумерация слева направо. Но, чет не робит ничего...
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #15 : 15-08-2012 18:23 » |
|
vika, рекомендую почитать книгу "Программирование на Perl" Ларри Уолл и другие. (русский перевод, издательство Символ). У нас есть скан 3-го издания: https://club.shelek.ru/viewfiles.php?id=19 У меня оно есть в бумажном виде - книга стоящая. Глава 5 "Поиск по шаблону", около 70 страниц. Там самое полное описание возможностей Perl по части регулярных выражений. Та часть, что интересует тебя, именуется "захват" - в книге этому посвящены три страницы. Что-то мы можем рассказать здесь, но все же за деталями обратись к книге. Конструкция "\1" называется ссылкой - это не переменная. Использование сего не просто и требует внимательности. Если не работает, то приводи выражение и контрольную строку, на которой проверяешь. Иначе и сказать больше нечего.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
vika
|
|
« Ответ #16 : 17-08-2012 16:15 » |
|
Большое спасибо.
|
|
|
Записан
|
|
|
|
|