2014-02-10 6 views
1

в следующем:Как проверить, что соответствует регулярному выражению?

~$ perl -e ' 
my $var = "March 1998"; 
$var =~ /([0-9]*)/; 
print "$1\n"; 

Ничего не печатается. Я не мог понять, почему, но, немного подумав об этом, я думаю, что он соответствует только части числа, так как ему требуется 0 или более случаев числа, и вся строка удовлетворяет этому. Но как я могу увидеть/«захватить» то, что он на самом деле соответствует, чтобы подтвердить мое предположение>

+0

Как насчет использования '$ &'? Но если вы хотите проверить, совпадает ли он как минимум с 1 номером, вам нужно использовать '+' вместо '*'. – AntonH

+3

Я думаю, вы хотите '[0-9] +', который чаще всего записывается как '\ d +'. – squiguy

+0

Кто-то с большим количеством времени может объяснить это лучше, но проблема заключается в '*'. Это означает «ноль или больше», и это жадно. Таким образом, он соответствует одному из этих чисел в нулевое время и называет его днем. Результат матча «true» ... но захват пуст (нулевое время). '+' - это «один или несколько», поэтому вы получаете «1998» в захвате. –

ответ

4

$1 содержит то, что захвачено, поэтому вы делаете это правильно.

Специальные переменные $', $& и $` также будут полезны. См. perlvar для получения дополнительной информации.

$match = $var =~ /([0-9]*)/; 

print "There ", ($match ? "was" : "was not"), " a match\n"; 
print "The captured expression was '$1'\n"; 
print "The matched expression was '$&'\n"; # includes chars outside capture groups 
print "Expression before the match was '$`'\n"; 
print "Expression after the match was '$''\n"; 

Начиная с Perl 5.10, вы можете также использовать /p модификатор и более читаемый ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} переменных.

$match = $var =~ /([0-9]*)/p; 

print "There ", ($match ? "was" : "was not"), " a match\n"; 
print "The captured expression was '$1'\n"; 
print "The matched expression was '${^MATCH}'\n"; 
print "Expression before the match was '${^PREMATCH}'\n"; 
print "Expression after the match was '${^POSTMATCH}'\n"; 
4

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

Переменные @- и @+ дают начальные и конечные индексы (соответственно) соответствующих групп захвата в строке, которая была объектом предыдущего успешного совпадения регулярных выражений.

if ($var =~ /([0-9]*)/) { 
    print "The first capturing group matched from index $-[1] to index $+[1].\n"; 
} 

Печатается The first capturing group matched from index 0 to index 0. Конечно же, ваша строка начинается с нуля цифры, так это то, что было подобрано.

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