1. ホーム
  2. スクリプト・コラム
  3. パール

Perlの強力な正規表現の例を解説

2022-02-07 08:17:04

I. はじめに

正規表現の仕様は言語ごとに異なりますが、基本的には似ていて、メタキャラクタの組み合わせでマッチングします。Nmapの組み込みサービスやバージョン検出はPerlの正規仕様を使っているので、このブログでは、後で確認するのに便利なPerlの正規性の関連内容を記録しています。

II. Perlの正規の例

以下の例は欠点がある可能性があり、ブログから派生したもので検証されていないものもあります。

1. IPアドレスの照合

\d+\. \d+\. \d+\. \d+

               \Ȃd:数字1文字にマッチ、Ȃd+:数字1文字以上にマッチします。

               \Ÿ エスケープ文字を使用した'.

2. 匹配邮箱类似于[email protected]

/^[a-zA-Z0-9_\-.] +@[a-zA-Z0-9_\-]+. [a-zA-Z]+$

        ^: の先頭にマッチします。

        $: は最後にマッチします。どちらも、連続した文字列であることを保証します。

3. 数字を合わせること。

m/^[0-9]+$

       ^で始まり$で終わることで、数字だけが含まれるようになり、末尾の$だけなら、abc12も可能である。

       入力が数字かどうかをチェックする入力バリデーションに使用することができます。

4. ユーザー入力温度(華氏、摂氏)、変換のためにプログラムされた

m/^([-+]? [0-9]+)([CF])$/ : 正負の整数の温度にマッチします。

        [CF】:片方の括弧にマッチします。

        直前の部分式に0回または1回マッチします。

        +: 直前の部分式に1回以上マッチします。

        perl は部分式にマッチしたテキストを一時変数 $1,$2 に保存します。

m/^([-+]? [0-9]+(? :\. [0-9]*)?) \s*([CF])$/i) : フラクショナルサポートによる温度マッチングの追加

        一時変数が保存される順番は、式中のグループ化()の開カッコの順番(左から右)と関係があります。したがって、ここでは ? : を使っていますが、これはそのカッコにマッチした値は一時変数に保存されないことを意味します。

        /i: は大文字小文字の区別を無視し、cf にマッチすることを意味します。

    参考アドレス:https://segmentfault.com/a/1190000004375773(マスタリング正規表現(第3版))  

5. 空白行のマッチング

^$  : 開始直後に終了:空白行、文字を含まない

\n\s*\r :


     \をクリックします。
     \୧⃛(๑⃙⃘⁼̴̀꒳⁼̴́๑⃙⃘)
     \r match a carriage return character, equivalent to \x0d

6. 最初と最後の空白文字にマッチングします。

^\s*|\s*$

7.バージョン番号1.3.0などに合わせる。

[\d.]+

8. 特定の文字以外のすべての文字にマッチします。

[^a]* はaを除くすべての文字にマッチ、*は0回以上マッチを意味します。

[^abc]* a, b, c 以外のすべての文字にマッチすることを示す。

((? !win).) * は win を除くすべての文字にマッチすることを意味します。

Windows (? !95|98|NT|2000)' は "Windows3.1" の "Windows" にはマッチしますが

          Windows 2000"で"Windows"です。

9. 数字を合わせること。

^\d+(\. \d+)?

    ^: 何から始めるかを定義します。
    \d+: マッチする番号を示します。
    ? : は、その内容が任意であることを示す。

以下にマッチします。

  1): {"service": "nutcracker", "source": "ubuntu", "version": "0.3.0",

m|^\{"service": "nutcracker", "source":"([^"]+)", "version":"([\d.]+)",|

  2): 220 yzwb.net ESMTP MDaemon 10.1.2;

m|^220[ -]([-. \w]+) ESMTP MDaemon (\d[-. \w]+);

  3): AMQPx01x01x00n

m|^AMQP\x01\x01\x00\x0a$|: なお、16進数では、エンターキー \n は \x0a に、 \r は \x0d に対応します。

  Nmap の nmap-services-probe ファイルは、以下のようにマッチします。

III. 通常のメタキャラクタ

メタキャラクタは、正規表現の基本要素である。

<テーブル キャラクター 説明 \ 次の文字を特殊文字、プリミティブ文字、後方参照、または8進エスケープとしてマークします。例えば、'n'は文字"n"にマッチします。\n' は、改行文字にマッチする。また、「♪」は「♪」に、「♪」は「(")」にマッチします。 ^ 入力文字列の開始位置と一致する。RegExpオブジェクトのMultilineプロパティが設定されている場合は、' \n' または ' \r' の次の位置にもマッチします。 $ 入力文字列の末尾にマッチします。RegExpオブジェクトのMultilineプロパティが設定されている場合は、'˶'や'˶'の前の位置にもマッチします。 * 直前の部分式に0回以上マッチします。例えば、zo* は "z" だけでなく "zoo" にもマッチすることができます。* は {0,} と同じです。 + 直前の部分式に1回以上マッチします。例えば、'zo+' は "zo" と "zoo" にマッチしますが、 "z" にはマッチしません。+ は {1,} と同じです。 ? 直前の部分式に0回または1回マッチします。例えば、 "do(es)?" は "do" または "does" の中の "do" にマッチします。 は {0,1} と等価です。 {n} n は非負の整数です。一定数のn回にマッチする。例えば、'o{2}' は "Bob" の 'o' にはマッチしませんが、 "food" の両方の o にマッチすることができます。 {n,} n は非負の整数です。少なくともn回マッチする。例えば、'o{2,}' は "Bob" の 'o' にはマッチしませんが、 "foooood" の全ての o にはマッチします。o{1,}'は'o+'と同じです。' o{0,}'は'o*'と同じです。 {n,m} m と n は共に非負の整数で、n <= m とする。少なくとも n 回、最大 m 回マッチする。Liu, "o{1,3}" は "fooooood" の最初の3つのoにマッチします。o{0,1}」は、「o? コンマと2つの数字の間にはスペースを入れてはいけませんので、ご注意ください。 ? この文字の直後に他の制限文字 (*, +, ? , {n}, {n,}, {n,m}) が続く場合、マッチングパターンは非欲求型になります。非貪欲なパターンは、検索された文字列にできるだけマッチしませんが、デフォルトの 貪欲なパターンは、検索された文字列にできるだけマッチします。例えば、文字列 "ooooo" に対して、'o+?' は単一の 'o' にマッチし、'o+' はすべての 'o' にマッチします。 . 以外の任意の1文字にマッチします。を含むすべての文字にマッチさせるには、[.↘]のようなパターンを使用します。 (パターン) はパターンにマッチし、このマッチを取得します。得られたマッチは、VBScriptのSubMatchesセットまたはVisual Basic Scripting Editionの$0...$9プロパティを使用して、結果のMatchesセットから取得することができます。丸括弧文字にマッチさせるには、' または′。 '. (? :パターン) パターンにマッチするが、結果はフェッチしない。つまり、フェッチしないマッチであり、後で使用するために保存されることはない。これは、"または" 文字 (|) を使用してパターンの部分を結合するときに便利です。たとえば、'industr(? :y|ies)' は 'industry|industries' よりも省略された表現になります。 (? =pattern) パターンにマッチする文字列の先頭でルックアップ文字列とマッチするフォワードプリフェッチ。これは非フェッチマッチで、後で使用するためにマッチをフェッチする必要がないことを意味します。たとえば、'Windows (? =95|98|NT|2000)' は "Windows 2000" にマッチしますが、"Windows 3.1" の "Windows" にマッチしません。つまり、マッチが発生した後、次のマッチの検索は最後のマッチの直後から始まり、プレサーチを含む文字の直後ではありません。 (? !パターン) Negative lookahead は、パターンにマッチしない文字列が文字列の先頭にマッチした時点で、検索文字列にマッチします。これは非フェッチマッチで、後で使用するためにマッチをフェッチする必要がないことを意味します。例えば、'Windows (? !95|98|NT|2000)' は "Windows3.1" にマッチしますが、"Windows2000" にはマッチしないのです。つまり、マッチした後、次のマッチの検索は最後のマッチの直後から始まり、プリサーチを含む文字の直後からは始まりません。 x|y 例えば、'z|food' は "z" または "food" にマッチします。(z|f)ood' は "zood" または "food" にマッチします。 [xyz] 文字のセットです。含まれる文字のいずれかにマッチする。例えば、'[abc]'は"plain"の'a'にマッチすることができます。 [^xyz] 負の文字のセット。含まれない文字にマッチする。例えば、'[^abc]' は "plain" の 'p' にマッチすることができます。 [a-z] 文字範囲。指定された範囲内の任意の文字にマッチします。例えば、'[a-z]' は 'a' から 'z' の範囲にあるすべての小文字にマッチすることができます。 (^a-z) 負の文字範囲。指定された範囲に含まれない文字にマッチします。例えば、'[^a-z]' は 'a' から 'z' までの範囲に含まれない任意の文字にマッチすることができます。 \b 単語の境界、つまり単語とスペースの間の位置にマッチする。例えば、'erb' は "never" の 'er' にはマッチするが、"verb" の 'er' に はマッチしない。 \B 単語以外の境界にマッチする。' erB' は 'verb' の 'er' にマッチするが 'never' にはマッチしない。 \♪♪~ xで指定された制御文字にマッチします。例えば、 \cM は Control-M またはキャリッジリターン文字にマッチします。 xの値はA-Zまたはa-zのいずれかでなければなりません。そうでなければ、cを本来の'c'文字として扱います。 \d 数値文字にマッチします。0-9]に相当します。 \D 数字以外の文字にマッチします。0-9]に相当します。 \f 改ページ文字にマッチします。\x0c と \cL に相当します。 \n 改行文字にマッチします。\x0a, \cJ と同等です。 \r キャリッジリターン文字にマッチします。\x0d と \cM に相当します。 \s スペース、タブ、改ページなどを含む、あらゆる空白文字にマッチします。Equivalent to [ \fnăt ]。 \S 空白でない任意の文字にマッチします。Equivalent to [^ ∕∕T∕v]. \t タブ文字にマッチします。\x09, \cIと同等です。 \v 垂直タブにマッチします。\x0b, \cK と同等です。 \w アンダースコアを含むすべての単語文字にマッチします。A-Za-z0-9_]と同じ意味です。 \W 任意の非単語文字にマッチします。A-Za-z0-9_]に相当します。 \ЪЪЪ nにマッチする。nは16進数のエスケープ値である。16進数のエスケープ値は、決められた2桁の長さでなければなりません。例えば、'ⅳx41'は'A'にマッチします。\'ⅳx041' は 'ⅳx04' & "1" と同じです。ASCIIエンコーディングは正規表現で使用することができます... \Ȃ num は正の整数です。得られたマッチへの参照。例えば、'(.) \1' は2つの連続した同じ文字にマッチします。 \n 8進数のエスケープ値または後方参照を識別する。\n の前に少なくとも n 個のフェッチされた部分式がある場合、n は後方参照です。それ以外の場合、nが8進数(0~7)なら、nは8進数エスケープです。 \ʕ-̫͡-ʔ nm は、下位式の少なくとも nm 個の獲得が先行する場合、後方参照となります。nm は下位式の取得が nm 以上先行する場合、後方参照となり、その後にリテラル m が続きます。以前の条件をいずれも満たさない場合、n と m が共に 8 進数 (0-7) であれば、8 進数のエスケープ nm と一致します。 \ʕ-̫͡-ʔ nが8進数(0〜3)で、mとlが共に8進数(0〜7)の場合、8進数エスケープnmlにマッチします。 \୧⃛(๑⃙⃘◡̈๑⃙⃘) n にマッチします。n は、16 進数 4 桁で表される Unicode 文字です。例えば、著作権記号(?)にマッチします。

上記のメタキャラクタを使用すると、すべてのマッチングパターンを組み合わせることができる。ここでは、一般的な正規表現をいくつか紹介します。

漢字にマッチする正規表現 [\u4e00-\u9fa5]

コメント 中国語のマッチングは本当に頭が痛いのですが、この表現では

全角文字(漢字を含む)にマッチングします。

 [^\x00-\xff]

解説:文字列の長さを計算するのに使える(全角文字は長さ2、ASCII文字は1として数える)

空白行にマッチする正規表現。

\n\s*\r

解説:空白行の削除に使用できます。

HTMLタグにマッチする正規表現。

<(\S*?) [^>]*>. *? |<. *? />

注:インターネット上で流通しているバージョンは、上記のものがその一部にしかマッチしないほどひどいもので、複雑なネストされたタグに対してはまだ何もできない。

最初と最後の空白文字にマッチする正規表現。{{code

^\s*|\s*$

コメント 行頭と行末の空白文字(スペース、タブ、改ページなどを含む)を削除するのに非常に便利な表現です

電子メールアドレスにマッチする正規表現。

\w+([-+.] \w+)*@\w+([-.] \w+)*\. \w+([-.] \w+)*

解説:フォームバリデーションの際に便利な

URL の URL にマッチする正規表現。

 [a-zA-z]+://[^\s]*

注:インターネット上で流通しているバージョンは、機能が非常に限定されていますが、上記のものは基本的にニーズを満たしています

口座番号が正規のものであるかどうか(文字で始まる、5~16バイトを許容、英数字のアンダースコアを許容)をマッチングします。

^[a-zA-Z][a-zA-Z0-9_]{4,15}$

解説:フォームバリデーションの際に便利な

国内の電話番号の照合

\d{3}-\d{8}|\d{4}-\d{7}

コメント 0511-4405222や021-878822などのマッチングフォーム

テンセントQQ番号に一致するもの

[1-9][0-9]{4,}

解説 10000からテンセントQQ数

中国の郵便番号の一致

[1-9]\d{5}(?! \d)

解説 中国の郵便番号は6桁

一致するID

\d{15}|\d{18}

解説 中国のIDカードは15桁か18桁

一致するipアドレス

\d+\. \d+\. \d+\. \d+

解説:IPアドレスを抽出する際に便利です。

特定の数字にマッチします。

^[1-9]\d*$ //match positive integers

^-[1-9]\d*$ //match negative integers

^-? [1-9]\d*$ //match integers

^-[1-9]\d*|0$ //match non-negative integers (positive integers + 0)

^-[1-9]\d*|0$ //match non-positive integers (negative integers + 0)

^[1-9]\d*\. \d*|0\. \d*[1-9]\d*$ //match positive floating point numbers

^-([1-9]\d*\. \d*|0\. \d*[1-9]\d*)$ //match negative floating point numbers

^-? ([1-9]\d*\. \d*|0\. \d*[1-9]\d*|0?\.0+|0)$ //matching floating point numbers

^[1-9]\d*\. \d*|0\. \d*[1-9]\d*|0?\.0+|0$ //match non-negative floating point numbers (positive floating point numbers + 0)

^(-([1-9]\d*\. \d*|0\. \d*[1-9]\d*))|0?\.0+|0$ //match non-positive floating point numbers (negative floating point numbers + 0)

解説:大量のデータを扱うときに便利、特定の用途のための補正に注意

特定の文字列にマッチします。

^[A-Za-z]+$ //matches strings consisting of 26 letters of the alphabet

^[A-Z]+$ // match strings consisting of 26 letters in uppercase

^[a-z]+$ // match a string of 26 letters in lower case

^[A-Za-z0-9]+$ // match strings consisting of numbers and 26 letters of the alphabet

^\w+$ //matches strings consisting of numbers, 26 letters or underscores

IV. 概要

  (1)異なるシナリオ、異なる言語は、ルールのわずかな違いがあるでしょう、限り、あなたは基本的なメタ文字と対応する言語の機能を習得するように、時間の本当の使用は、1つまたは2つの例で慣れるために10分を費やすことを開始することができるようになる。

  2)Perlの規則性は機能を含めて現在最高であり、データ処理に大きなメリットがあるため、読者にはその習得をお勧めします。

  3) 私の理解では、データを抽出するという目的を達成するだけなら、正規のマッチングの原理は理解する必要はなく、ただ使えばよい。

さて、上記はこの記事のすべての内容です、私はあなたの勉強や仕事のためのこの記事の内容は、特定の参照学習価値があることを願って、あなたが交換するメッセージを残すことができます質問がある場合は、BinaryDevelopをサポートしていただきありがとうございます。