Perl拡張の正規表現コード解析
2022-01-30 17:48:34
コピーコード
コードは以下の通りです。
my $ip = "192.168.0.1|192.168.0.2|192.168.0.1";
if ( $ip =~ /
^
(? :
((? :\d{1,3}\. {3}\d{1,3})
(? =
(? :
\|(?! \1)(?1)
)*
\z
)
\|
)*
(?1)
$
/x ) {
print "match\n";
}
perlreのドキュメントにしたがって、少しずつ説明します。まず/xですが、これは正規表現からスペースを取り除くためのもので、そうしないと1行で読むのが大変です。次に^ですが、これは一番最初から始まることを意味します。次に(? : で、これはこのブラケットが逆参照$&にクレジットされていないことを意味します。次に ((? :\d{1,3}.) {3}d{1,3}) で、これも(?)がつきます。: があり、これはこの行がipにマッチし、$1としてカウントされることを意味します。次に ((? = があり、これは上の行の後に、この括弧内の定義にマッチする正規表現が必要で、これも$&としてカウントされないことを意味します(この用語は "zero-width positive forward assertion" というのですね)。次にipを区切る|、次に(?!)、これはこの括弧の中にあるものは決して現れてはならないことを意味し、これも$&にカウントされません(用語では"ゼロ幅の負の前方アサーション"、と言いますね)。そして、前の行で捕捉した$1と、前の行で説明したアサーション、つまり|と前のマッチするipの後に重複するipはありえないという意味の▼があり、前の行で$1を捕捉した正規表現、つまりipを重複させずに新しいipを捕捉し続けているという意味の▼があり、その▼に閉じる(?)、その▼がある。: で、これは|ip|を複数回繰り返すことができることを意味します;そして、文字列の境界であり、1行の$の役割に相当し、この場合は交換可能で、ここでは(?!)のチェックを最後まで行うために使われる˶′˶です;そして、(?)を閉じる(?)があり、これは(?)を閉じる(?)を意味します。=; 次に | と ) があり、ここでは ^( に閉じて、ip を繰り返さないという条件を満たす ip| 形式が常に正規にマッチすることを示します; 次に (?1)$ で、最後の ip を定義し、$1 と同じルール、つまり、文字列に少なくとも1つの ip がなければならないことを示します。OK、説明終了。実際には、後ろから前に、むしろ明確な〜〜〜別の:{CODE}の(????)段落のPerlre {Perl 5.12.x以前では、正規表現エンジンがリエントラントではなかったため、遅延したコードは安全に正規表現エンジンを呼び出すことができませんでした(直接的には "m//" や "s//" )、間接的には "split"." や (?R), (????) などの関数で。{CODE})は似たような単純な作業を行うので、linuxのディストリビューションに付属しているperlのバージョンが低いと、ここで(?1)のような単純な書き方はできず、自分で書き直さなければならない。という風に判断できます。
コピーコード
コードは以下の通りです。
my $re = $^V lt v5.14 ? '(? :\d{1,3}\.?) {4}' : '(?1)';
my $ip = "192.168.0.1|192.168.0.2|192.168.0.3|192.168.0.4|192.168.0.5";
if ( $ip =~ m/
^
(? :
((? :\d{1,3}\...?) {4})
(? =
(? :
\|(?! \1)$re
)*
\z
)
\|
)*
$re
$
/x ) {
print "$1 match\n";
}
関連
-
指定したフォルダーにあるリンク切れファイルのシンボリックリンクを自動的に削除するスクリプト
-
PerlとJSの比較 (配列、ハッシュ)
-
dig と nali を使って DNS 解決アドレスが一貫しているかどうかを判断する Perl スクリプトです。
-
Perlによるディレクトリの探索とLinuxコマンドによるログの解析 コード例共有
-
Perlのファイルハンドルの説明
-
長さを指定し、ランダムなDNA配列を生成するperlスクリプトコード
-
Perlにおけるchompとchopの違いの紹介
-
perlのour-my-localスコープ宣言の紹介
-
Perl で File::Lockfile を使用して、スクリプトの単一インスタンスを確保する
-
Javaプログラマのための10分でわかる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 実装 サイバーパンク風ボタン
おすすめ
-
perl チュートリアル perl チュートリアル集
-
Perlグラフィカルパッケージ管理ツール PPMラーニングノート
-
Perlは先頭と末尾の空白を削除します(左右の空白文字、空白文字を削除します)。
-
perl 操作 MongoDB エラー 未定義のシンボル。HeUTF8 解決策
-
Perl プロセスの PID ルックアップの例
-
Perl 組み込み特殊変数まとめ
-
[解決済み] ディレクトリで終わるパスに対してcatfileを使用した場合の危険性?
-
[解決済み] Perlで強制的にフラッシュ出力することはできますか?
-
[解決済み] Perlでディレクトリ一覧を取得するには?[重複している]。
-
[解決済み] perl で awk コマンドを実行する