Как сопоставить регулярное выражение - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу сопоставить строку с регулярным выражением Perl, но мой код всегда не совпадает.

Данные

Functions    0.0% (0/1)Functions and exits    0.0% (0/2)Calls    0.0% (0/6)Statement blocks    0.0% (0/24)Implicit blocks    0.0% (0/2)Decisions    0.0% (0/26)Basic conditions    0.0% (0/39)

Регулярное выражение

.*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*

Кажется, это работает на нескольких сайтах тестирования регулярных выражений.

Код Perl

my $regexp = ".*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*";

if ( $myString =~ /$regexp/i ) {     # $myString has the value shown above
    print "Regexp OK\n";
}
else {
    print "Regexp KO\n";
}

Результат выполнения этого кода всегда приводит к блоку else, но я не понимаюпочему.

1 Ответ

0 голосов
/ 25 апреля 2018

Вы используете двойные кавычки, когда определяете свое регулярное выражение.Это означает, что \s будет интерполироваться как escape-последовательность, и это нарушит ваш шаблон.

Вместо этого используйте qr//.

my $regexp = qr/.*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*/;

Если вы имелиuse warnings, вы получите это предупреждение.

Нераспознанные escape-данные пройдут через

Если вы напечатаете скомпилированное регулярное выражение с

my $regexp = ".*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*";
print qr/$regexp/;

вы увидите этот вывод.

#                no backslash here
#                 V
(?^:.*([A-Z][a-z]*s*[0-9]*.[0-9]*%s*([0-9]*/[0-9]*)).*)

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

...