Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: $1, $2 ... $9  (Прочитано 20171 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« : 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-08-2012 19:24 » 

vika, а я вообще этого кода не пойму. Чего ищется?

Парсинг атрибутов будет примерно так:
Код:
/cellspacing="(\d*)"\s+.*width="(\d+.*)?"/
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 13-08-2012 21:09 » 

Согласен: задачу нужно описывать, а не вываливать свои потуги.

Дим, кстати, твое выражение с изъяном и "?" не понятно к чему. Сдается, ты скобку рано поставил.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-08-2012 05:33 » 

RXL, ко второй группе. Другое дело, что по принципу жадного алгоритма .* во второй группе отхватит не содержимое кавычек после width, а кусок от начальной кавычки width до самой последней кавычки в строке. И вот это проблема. Я на вскидку не помню, какие суффиксы после числа могут быть у width, кроме %.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 14-08-2012 05:52 » 

Пробелы могут быть. Шаблон следующий: "\s*(\d+)\s*%?\s*". При этом, если это не XHTML, то и кавычки могут быть опцией.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 14-08-2012 06:25 » 

RXL, не согласен. Ты из группы исключил суффикс, а это существенная информация - единица измерения.

Вообще атрибуты надо поштучно обрабатывать. Ведь их порядок тоже может быть произвольным.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 14-08-2012 09:01 » 

В HTML/XHTML нет суффиксов! Ты путаешь с CSS.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 14-08-2012 11:34 » 

RXL, как минимум там может быть число, или число с процентом. Вот это-то я точно не путаю.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 14-08-2012 13:31 » 

Совершенно верно. И шаблон в ответе 4 это учитывает.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 14-08-2012 15:01 » 

RXL, он это не учитывает постольку, поскольку тема про группы, про $1...$9. Ты же не поместил процент внутрь группы (скобок), т.е. при чтении группы ты не узнаешь, был ли там процент или не было, хотя в целом выражение будет распознано.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 14-08-2012 15:10 » new

В таком случае, предлагаю шаблон такого вида: "\s*(\d+)\s*(%)?\s*"
Думаю, логичнее использовать две группы, чем проверять, есть ли в конце знак процента и нет ли пробелов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 14-08-2012 15:26 » 

RXL, ну это уже зависит от задачи. Однако автор темы куда-то пропала.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #12 : 15-08-2012 07:48 » 

В таком случае, предлагаю шаблон такого вида: "\s*(\d+)\s*(%)?\s*"
Не работает шаблон

Добавлено через 33 секунды:
RXL, ну это уже зависит от задачи. Однако автор темы куда-то пропала.
Так как все-таки вытаскивать из текста нужные куски???
« Последнее редактирование: 15-08-2012 07:48 от vika » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 15-08-2012 09:32 » 

Код: (Perl)
$test =~ m/\scellspacing\s*=\s*"\s*(\d+)\s*"[^>]*\swidth\s*=\s*"\s*(\d+)\s*(%)?\s*"/;

print "$1\n\$2$3\n";
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #14 : 15-08-2012 14:28 » 

Спасибо за пример. Но, хотелось бы услышать общие принципы. Что не читала, все или не работает, или очень заумно для понимания. Из того, что поняла
Код:
=~m/(первое совпадение)\1 (второе совпадение)\2 ... (n-ное совпадение)\n/
Каждая скобка - подшаблон, \1 - локальная переменная, нумерация слева направо. Но, чет не робит ничего... А черт его знает...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 15-08-2012 18:23 » 

vika, рекомендую почитать книгу "Программирование на Perl" Ларри Уолл и другие. (русский перевод, издательство Символ). У нас есть скан 3-го издания: https://club.shelek.ru/viewfiles.php?id=19 У меня оно есть в бумажном виде - книга стоящая. Глава 5 "Поиск по шаблону", около 70 страниц. Там самое полное описание возможностей Perl по части регулярных выражений. Та часть, что интересует тебя, именуется "захват" - в книге этому посвящены три страницы. Что-то мы можем рассказать здесь, но все же за деталями обратись к книге.

Конструкция "\1" называется ссылкой - это не переменная. Использование сего не просто и требует внимательности. Если не работает, то приводи выражение и контрольную строку, на которой проверяешь. Иначе и сказать больше нечего.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #16 : 17-08-2012 16:15 » 

Большое спасибо. Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines