クイックスタート
チュートリアル
ツールと言語
リファレンス
書評
正規表現の例
数値範囲
浮動小数点数
メールアドレス
IPアドレス
有効な日付
数値日付をテキストに変換
クレジットカード番号
完全な行の一致
重複行の削除
プログラミング
2つの近接した単語
落とし穴
カタストロフィックバックトラッキング
過剰な繰り返し
サービス拒否
すべてをオプションにする
繰り返しキャプチャグループ
Unicodeと8ビットの混合
このサイトについてさらに
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書評
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexMagic—Generate regular expressions matching ip addresses and ranges

IPアドレスの検索または検証方法

IPアドレスの一致は、正規表現の複雑さと正確さの間のトレードオフの良い例です。\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\bは、IPアドレスにうまく一致します。しかし、これも一致します。999.999.999.999有効なIPアドレスであるかのように。正規表現フレーバーがUnicodeをサポートしている場合、次のようなものにも一致する可能性があります。١٢٣.१२३.೧೨೩.๑๒๓。これが問題かどうかは、正規表現を適用するファイルやデータによって異なります。

4つのIPアドレス数値の制限とキャプチャ

IPアドレスの4つの数値をすべて0〜255に制限するには、次の正規表現を使用できます。これは、IPアドレスの4つの数値をそれぞれキャプチャグループに格納します。これらのグループを使用して、IP番号をさらに処理できます。フリースペースモードを使用すると、ページの幅に収まります。

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
  
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
  
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
  
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

上記の正規表現では、10〜99の数値には先頭のゼロが1つ、0〜9の数値には先頭のゼロが最大2つ許容されます。厳密に言うと、先頭のゼロを含むIPアドレスは8進表記を示しています。そのため、先頭のゼロを許可しないようにすることもできます。これには、少し長い正規表現が必要です。

\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.
  
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.
  
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.
  
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b

4つのIPアドレス数値の制限(キャプチャなし)

個々の数値へのアクセスが必要ない場合は、上記の3つの正規表現を量子化子を使用して短縮できます。

\b(?:\d{1,3}\.){3}\d{1,3}\b

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
  
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

\b(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}
  
(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b

ユーザー入力の確認

上記の正規表現は、単語境界を使用して、IPアドレスの先頭と末尾の数字がより長い英数字のシーケンスの一部にならないようにしています。これらの正規表現は、より長い文字列の中でIPアドレスを見つけるのに適しています。

文字列がIPアドレスのみから構成されていることを確認することで、ユーザー入力を検証したい場合は、単語境界を文字列の先頭と末尾のアンカーに置き換える必要があります。専用のアンカーを使用できます。\Aそして\z使用している正規表現フレーバーがこれらをサポートしている場合。

\A(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
  
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\z

そうでない場合は、^そして$を使用し、改行文字で一致するオプションがオフになっていることを確認する必要があります。

^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
 (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$