2016-03-14 3 views
2

Я собираюсь извлечь имя и идентификатор некоторых Царапины данных с помощью этого сценария:регулярное выражение не соответствует в Perl

if ($string =~ m/(;r=\d*.*<)/) { 

    $mystring = $1; 
    $mystring =~ s/;//; 

    if ($mystring =~ m/(>.*<)/) { 

     $mystring = $1; 
     $mystring =~ s/>//; 
     $mystring =~ s/<//; 

     print "$mystring \n"; 
    } 
} 

, в котором $string содержит одну строку входного файла на одну итерацию. Вот несколько строк:

<pre> 
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959195" >ZAN 3713</option> 
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959194" >ZAN2310</option> 
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959193" >ZAN2410</option> 

Что я ожидаю, как правило, является ;r=4294959193" >ZAN2410< как результат; но проблема в том, что Perl не обнаруживает совпадений! Есть ли проблемы с моим регулярным выражением?

+2

Если у вас есть полный HTML-документ, вы должны использовать парсер HTML вместо регулярных выражений. – simbabque

+0

@simbabque Вы правы, но, как вопрос, я хочу знать, в чем проблема. –

+0

Я думаю, что это может быть слишком жадным, но мне нужно будет увидеть, как вы читаете файл и что содержит '$ string'. Вы можете добавить ['use re 'debug''] (https://metacpan.org/pod/re#debug-mode) в начало своего кода, чтобы узнать, что делает механизм регулярных выражений. Это может дать вам подсказку. – simbabque

ответ

2

Да, возможно, есть. Но, честно говоря, я бы, наверное, занялся этим по-другому. Использование парсера HTML - это первый порт захода.

Как, например - вы повторно использовать $mystring, и это, как правило, предупреждающий знак, что вы не используете strict и warnings, и, таким образом, делая вещи, которые вы не ожидали.

Вы не получаете выход вы хотите, потому что вы перезаписать $mystring с этим битом, например:

if($mystring =~ m/(>.*<)/){ 
     $mystring = $1; 

Но пробежав код с данными выборки - это, кажется, почти работу - потому что вы «повторно затирания $mystring вы получаете:

ZAN 3713 
ZAN2310 
ZAN2410 

Я хотел бы предложить несколько иной подход, хотя:

while (<DATA>) { 
    m/r=(\d+)\"\s*>([^<]+)/g && print "$1 $2\n"; 
} 

__DATA__ 
<pre> 
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959195" >ZAN 3713</option> 
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959194" >ZAN2310</option> 
<option data-url="/nav/extra/list?s=prix_asc&amp;cat=436&amp;npk=1&amp;b=4294959199&amp;r=4294959193" >ZAN2410</option> 

Это дает выход:

4294959195 ZAN 3713 
4294959194 ZAN2310 
4294959193 ZAN2410 
+0

Большое спасибо Sobrique. Я могу решить проблему благодаря вашему решению. –

0

Ваш код, кажется, делать то, что вы просите. Значения (первый) $mystring вычисляться

;r=4294959195" >ZAN 3713< 
;r=4294959194" >ZAN2310< 
;r=4294959193" >ZAN2410< 

последними из которых соответствует вашей ожидаемой строке ;r=4294959193" >ZAN2410<

Но затем вы идете, чтобы извлечь значение между > и < и печатью, что, что дает

ZAN 3713 
ZAN2310 
ZAN2410 

Который снова является тем, чего я ожидал бы, поэтому я не вижу здесь никакой проблемы. Чтобы получить результат, вы говорите, что хотите просто опустить внутренний блок if

Смежные вопросы