Perlの強力な正規表現の例を解説
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セットから取得することができます。丸括弧文字にマッチさせるには、'
上記のメタキャラクタを使用すると、すべてのマッチングパターンを組み合わせることができる。ここでは、一般的な正規表現をいくつか紹介します。
漢字にマッチする正規表現
[\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をサポートしていただきありがとうございます。
関連
-
Perl uc,lc,ucfirst,lcfirst 大文字・小文字変換関数群
-
Django フレームワークでテンプレートフィルタをカスタマイズする
-
Perlは先頭と末尾の空白を削除します(左右の空白文字、空白文字を削除します)。
-
プロポーズ用Perlコードの書き換えについて
-
Perl による日付と時刻の取得のサンプルコード
-
PerlでMIME::Liteを使ったメール送信の例
-
perlのファイルテスト演算子のまとめ
-
[解決済み] "デバイスに不適切なioctl"
-
[解決済み] Perlで配列を比較するにはどうしたらいいですか?
-
[解決済み] Perlで文字列の各単語の最初の文字を大文字にするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン