Поиск…


Соответствующие строки

Оператор =~ пытается сопоставить регулярное выражение (выделенное / ) в строку:

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow