【perl】学習ノート(四)--正規表現

5597 ワード

正規表現はPerl言語の特色であり、基本的な文法は難しくないが、需要に合った効率的な正規表現を書くには、いくつかの挑戦がある.
Perlの3つのマッチングモード
1.検索
構文:m/正規表現の内容/;
役割:一致するコンテンツに「正規表現の内容」が含まれているかどうかを検索し、1が含まれている場合は0を返します.
[python]  view plain
 copy
#!user/bin/env perl -w  
#1...  
$str1 = "i like perl";  
$result1 = ($str1 =~ m/perl/);  
print "$result1 $str1";  
2.置換
構文:s/正規表現の内容/置換内容/;
役割:一致するコンテンツに「正規表現の内容」が含まれているかどうかを検索します.含まれている場合は、「置換内容」で置き換え、1を返します.そうでない場合は、0を返します.
補足:通常、一致するコンテンツに複数の一致可能なアイテムが含まれている場合、この構文は最初のものにのみ一致し、戻ってきます.
1.「真の表現の内容」は()を使用して含めることができます.これにより、「置換内容」で$1,$2を使用することができます.参照を行います.1、2は括弧の順序です.
2.Perlはパターン修飾語を提供する.修飾語は検索モードにも適用されます.
置換構文の後にgを追加します.すべての一致を置換
置換構文の後にeを追加します.置換内容を計算してから置換する必要があることを示します
置換構文の後にiを追加します.大文字と小文字を無視
置換構文の後にsまたはmを追加します.改行を許可()
[python]  view plain
 copy
#2...like をloveで置き換える
$str2 = "i like perl like i";  
$result2 = ($str2 =~ s/like/love/);  
print "$result2 $str2";  
  
#2...1すべてのlike をgで置き換える
$str2_1 = "i like perl like i";  
$result2_1 = ($str2_1 =~ s/like/love/g);  
print "$result2_1 $str2_1";  
  
#2...2 eを使用してperlに置換内容を先に計算するように伝える$str2_2 = "you should pay \$22 for this mechine!";  
$result2_2 = ($str2_2 =~ s/(22)/$1*2/e);  
print "$result2_2 $str2_2";  
3.変換
構文:tr/一致コンテンツセット/置換コンテンツセット/;
役割:まず、一致するコンテンツの集合の中の要素と置換集合の中の要素が1つ1つ対応して、それから一致する操作を実行して、一致する上の内容は対応する置換集合の中の内容を使って置換して、変換要素の個数を返します.
補足:
変換モードでは、正規表現と変数を置き換えることはできません.
「一致コンテンツセット」要素の個数が「置換コンテンツセット」要素より多い場合、多くの要素は「置換コンテンツセット」の最後の要素に対応します.
「一致コンテンツ集合」要素の個数が「置換コンテンツ集合」要素より少ない場合、「置換コンテンツ集合」の余分な要素は無視されます.
[python]  view plain
 copy
#3...小文字を大文字に変換する$str3 = "abcdefghijklmnopqrstuvwxyz";  
$result3 = ($str3 =~ tr/a-z/A-Z/);  
print "$result3 $str3";  
  
#3...1一致コンテンツ集合要素が置換コンテンツ集合要素よりも多い.
$str3_1 = "abcdefghijklmnopqrstuvwxyz";  
$result3_1 = ($str3_1 =~ tr/a-z/A-Y/);  
print "$result3_1 $str3_1";  
  
#3...2一致コンテンツ集合要素が置換コンテンツ集合要素より少ない.
$str3_2 = "abcdefghijklmnopqrstuvwxyz";  
$result3_2 = ($str3_2 =~ tr/a-y/A-Z/);  
print "$result3_2 $str3_2";  
演算結果は
[python]  view plain
 copy
1 i like perl  
1 i love perl like i  
2 i love perl love i  
1 you should pay $44 for this mechine!  
26 ABCDEFGHIJKLMNOPQRSTUVWXYZ  
26 ABCDEFGHIJKLMNOPQRSTUVWXYY  
25 ABCDEFGHIJKLMNOPQRSTUVWXYz  
Perlのバインドオペレータ
上の例では「=~」バインドオペレータが使用されていますが、バインドオペレータの役割は「マッチングが必要な内容」と「マッチングモード」をバインドして計算することです.
バインドオペレータには、次のものがあります.
=~:英語【does】はマッチングモードを満たすことを表す
!~ : 英語【doesnt】はマッチングモードを満たしていないことを示す
上記のメタ文字を用いて、所望のマッチングモードをすべて組み合わせることができる.一般的な正規表現をいくつか紹介する.
元のアドレス:http://lifesinger.3322.org/myblog/?p=185
中国語の文字にマッチする正規表現:[u 4 e 00-u 9 fa 5]コメント:中国語にマッチするのは本当に頭が痛いので、この表現があればやりやすいです
一致する2バイト文字(漢字を含む):[^x 00-xff]コメント:文字列の長さを計算するために使用できます(2バイト文字長計2、ASCII文字計1)
空白行に一致する正規表現:s*rコメント:空白行を削除できます
HTMLタグに一致する正規表現:]*>.*?1>|<./> コメント:ネット上で流布されているバージョンはあまりにも悪いので、上のこれも部分的に一致するだけで、複雑なネストマークには何もできません.
先頭行と末尾の空白文字を一致させる正規表現:^s*|s*$コメント:行の先頭行と末尾の空白文字(スペース、タブ、改ページなど)を削除するのに役立ちます.
Emailアドレスに一致する正規表現:w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]w+)*コメント:フォーム検証時に便利
URLに一致する正規表現:[a-zA-z]+://[^s]*コメント:ネット上に流布するバージョン機能は限られており、上記は基本的にニーズを満たすことができます.
照合アカウントが正当かどうか(アルファベット先頭、5-16バイト許可、アルファベット数字下線許可)^[a-zA-Z][a-zA-Z 0-9_]{4,15}$コメント:フォーム検証時に実用的
国内電話番号にマッチ:d{3}-d{8}|d{4}-d{7}コメント:マッチング形式は0511-4405222または021-87888822
腾讯QQ号:[1-9][0-9]{4,}评注:腾讯QQ号は10000から始まる
中国郵便番号にマッチ:[1-9]d{5}(?!d)コメント:中国郵便番号は6桁の数字
照合身分証明書:d{15}|d{18}コメント:中国の身分証明書は15位または18位
一致ipアドレス:d+.\d+\.\d+\.d+コメント:ipアドレスを抽出する際に役立ちます
特定の数字に一致:^[1-9]d*$//正の整数^-[1-9]d*$//負の整数^-?[1-9]d*$//マッチング整数^[1-9]d*|0$//マッチング非負整数(正整数+0)^-[1-9]d*|0$//マッチング非正整数(負整数+0)^[1-9]d*.\d*|0\.d*[1-9]d*$//正浮動小数点数^-([1-9]d*.d*|0.d*[1-9]d*)/負浮動小数点数^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$//一致浮動小数点数^[1-9]d*.\d*|0\.\d*[1-9]\d*|0?\.0+|0$//非負浮動小数点数(正浮動小数点数+0)^(-([1-9]d*.d*|0.d*[1-9]d*)|0?.0+|0$//非正浮動小数点数(負浮動小数点数+0)コメント:大量のデータを処理する際に役立ち、具体的な応用時に修正に注意する
特定の文字列の一致:^[A-Za-z]+$//26文字の英字からなる文字列^[A-Z]+$//26文字の大文字からなる文字列^[a-z]+$//26文字の小文字からなる文字列^[A-Za-z 0-9]+$//数字と26文字の英字からなる文字列^w+$//数字、26文字の英字または下線からなる文字列
          

      Unix        sed、awk、grep       ,     Perl          (Regular Expression)      。Perl          ,              。 Perl      ,              ,  CGI          。



           Perl      ,           ,                 ,   Perl                  。                     8    。 



                        ——        。           :



·   1:            (  (m/ /),  (s/ / /eg)   (tr/ / /))。



·   2:             ( $scalar =~ m/a/;     ; @array =~ m/a/   @array      ,        )。



·   3:                     。   ,             ( $a = 'string string2'; $a =~ s/string/ /;    $a = 'string 2')。



·   4:                        ( $a =~ m/$varb/      varb     ;   $varb = 'a' $a = 'as',$a =~ s/$varb/ /;     $a =~ s/a/ /; ,      $a = " s" )。



·   5:                 :         : $a=~ m/pattern/    $a        pattern   ,$a =~ s/(word1)(word2)/$2$1/  “  ”     。



·   6:                               。$a =~ m/\w+/            ;$a =~ m/\d/"          。



·   7:             ,Perl   "|"       。     m/(cat|dog)/     “      cat    dog。



·   8:Perl  (?..)               。(              )