LINUX.ORG.RU

perl, regexp


0

0

Уважаемые, научите. Есть:

<a href="some_url">text1</a>text2_with_spaces(text3) либо:
text2_with_spaces(text3)

мне надо получить text1, text2 и text3(в котором пробелы есть)

Пытаюсь делать так, для удобства разбил по строкам здесь:

if(
m/(<a.*>(.*)<\/a>){0,1}
(\w((\s\w)*)?)
\((.*)\)/
) {
Тут пытаюсь брать $1, $2, ...
}

но нифига не выходит, во-первых:

1. (<a.*>(.*)<\/a>){0,1} в случае не существования ссылки, когда текст сразу начинается с text2_with_spaces, это выражение ничего не вернёт, поэтому мне непонятно как быть в таких ситуациях в общем случае, когда я хочу дальше работать с переменными $1, $2, ... Число параметров изменится и уже нельзя, к примеру, обращаться к последней переменной, т.е. не в $1 вернётся NULL, а $1 станет следущая группировка.

2. (\w((\s\w)*)?) вложенные группировки... так, похоже, совсем нельзя делать... Непонятно в какую переменную что попадёт. На что это заменить?

Спасибо.

anonymous

Фразу:

"мне надо получить text1, text2 и text3(в котором пробелы есть)"

читать как:

"мне надо получить text1, text2(в котором пробелы есть) и text3"

anonymous
()

<a href="some_url">text1</a>text2_with_spaces(text3)
 либо:
text2_with_spaces(text3) 

my $Text1, $Text2, $Text3;
my $S = "<a href=\"some_url\">text1</a>text2_with_spaces(text3)";

if ( $S =~ /<a href/ )
{
  $S =~ /<a href=\"([^\"]*)\">([^\<]+)</a>([\a|\s]*)\(\w*)\)/;
  $Text1 = $2;
  $Text2 = $4;
  $Text3 = $6;
}
else
{
}

theserg ★★★
()

для подстроки вида:

<a href="some_url">text1</a>text2_with_spaces(text3) либо:
text2_with_spaces(text3)

регексп будет выглядеть наверное какннить так:

print $3 ? "$1 $2 $3\n" : "$1 $2\n" while $data=~m!^(>(.*?)</a>)?(.*?)\((.*?)\)$!igs;

работает так:

если перед шаблоном стоит "?", значит "если есть шаблон", т.е. если шаблона нет, то переменая $3 будет undef, что и проверяется в print

vilfred

p.s. работоспособность строчки не проверял, но смысл весь в квантификаторе "?"

anonymous
()
Ответ на: комментарий от anonymous

хотя, наверное, как-то так, консоли счас с перлом нету просто

print $3 ? "$1 $2 $3 $4\n" : "$1 $2\n" while $data=~m!(>(.*?)</a>)?(.*?)\((.*?)\)!igs;

т.е. конструкция ([тут навороченный регексп])? значит "если есть подходящая подстрока под навороченный регексп"

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.