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!
正規表現で文字列を解析する
一般的に、 複雑な構造を解析するために正規表現を使用することは良い考えではありません。しかし、それを行うことができます。たとえば、データをハイブテーブルにロードしたい場合、フィールドはコンマで区切りますが、配列のような複雑な型は "|"で区切ります。ファイルにはコンマで区切られたすべてのフィールドと複合型が角括弧で囲まれたレコードが含まれています。その場合、使い捨て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