Perl Language
Регулярные выражения
Поиск…
Соответствующие строки
Оператор =~
пытается сопоставить регулярное выражение (выделенное /
) в строку:
my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;
/^hello/
- действительное регулярное выражение. ^
- специальный символ, который сообщает регулярному выражению начинать с начала строки и не встречаться где-то посередине. Затем регулярное выражение пытается найти следующие буквы в порядке h
, e
, l
, l
и o
.
Регулярные выражения пытаются сопоставить переменную по умолчанию ( $_
), если она голая:
$_ = "hello world";
print "Ahoy!\n" if /^hello/;
Вы также можете использовать разные разделители, если вы предшествуете регулярному выражению с помощью оператора m
:
m~^hello~;
m{^hello};
m|^hello|;
Это полезно при сопоставлении строк, которые включают символ /
:
print "user directory" if m|^/usr|;
Использование \ Q и \ E в сопоставлении с образцом
Что между \ Q и \ E рассматривается как обычные символы
#!/usr/bin/perl
my $str = "hello.it's.me";
my @test = (
"hello.it's.me",
"hello/it's!me",
);
sub ismatched($) { $_[0] ? "MATCHED!" : "DID NOT MATCH!" }
my @match = (
[ general_match=> sub { ismatched /$str/ } ],
[ qe_match => sub { ismatched /\Q$str\E/ } ],
);
for (@test) {
print "\String = '$_':\n";
foreach my $method (@match) {
my($name,$match) = @$method;
print " - $name: ", $match->(), "\n";
}
}
Выход
String = 'hello.it's.me': - general_match: MATCHED! - qe_match: MATCHED! String = 'hello/it's!me': - general_match: MATCHED! - qe_match: DID NOT MATCH!
Разбор строки с регулярным выражением
Как правило, не рекомендуется использовать регулярное выражение для синтаксического анализа сложной структуры . Но это может быть сделано. Например, вы можете загрузить данные в таблицу hive, а поля разделяются запятой, но сложные типы, такие как массив, разделяются символом «|». Файлы содержат записи со всеми полями, разделенными запятой и сложным типом, находятся внутри квадратной скобки. В этом случае этот бит одноразового Perl может быть достаточным:
echo "1,2,[3,4,5],5,6,[7,8],[1,2,34],5" | \
perl -ne \
'while( /\[[^,\]]+\,.*\]/ ){
if( /\[([^\]\|]+)\]/){
$text = $1;
$text_to_replace = $text;
$text =~ s/\,/\|/g;
s/$text_to_replace/$text/;
}
} print'
Вы хотите определить результат:
1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5
Заменить строку, используя регулярные выражения
s/foo/bar/; # replace "foo" with "bar" in $_
my $foo = "foo";
$foo =~ s/foo/bar/; # do the above on a different variable using the binding operator =~
s~ foo ~ bar ~; # using ~ as a delimiter
$foo = s/foo/bar/r; # non-destructive r flag: returns the replacement string without modifying the variable it's bound to
s/foo/bar/g; # replace all instances