正規表現を使用したIPv4アドレスの検証


94

私はIPv4検証のための効率的な正規表現を取得しようとしていますが、あまり運がありません。ある時点で私はそれを持っていたように見えました(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}が、それはいくつかの奇妙な結果を生み出します:

$ grep --version
grep (GNU grep) 2.7
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.1
192.168.1.1
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.255
192.168.1.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.255.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.2555
192.168.1.2555

私はこれがすでに尋ねられて答えられているかどうかを確認するために検索を行いましたが、他の答えは単に1〜3の数字の4つのグループを決定する方法を示しているように見えます。


13
A、AB、ABCは、ABCDと同様にIPアドレスの有効な形式であることを忘れないでください。試してみてくださいping 2130706433ping 127.1クスクスのため。
dty 2011年

1
マイバリアントオンラインregexr.com/39hqf
Sllouyssgort

回答:


98

あなたはすでに実用的な答えを持っていますが、元のアプローチの何が悪かったのか興味がある場合に備えて、答えはあなたがあなたの交替の周りに括弧が必要であるということです、さもなければそれ(\.|$)は数が200未満の場合にのみ必要です。

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

26
これは、次のようなことも検証するようです192.168.1.1.1
cwd 2014

2
それは次のようになります:\b((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:(?<!\.)\b|\.)){4}; つまり、行末ではなく単語の境界で終わりますか?さらに、ここでは、不要なサブマッチを回避するために、キャプチャされていないグループにマークを付けました。注意:私はその形式のIPに精通していないため、@ dtyのコメントはまだ考慮されていません。彼はそれが有効であるように見えることは正しいが。
JohnLBevan 2016年

代わりにこれを試してみてください:((1?\ d \ d?| 2 [0-4] \ d | 25 [0-5])\。){3}(1?\ d \ d?| 2 [0-4] \ d | 25 [0-5])
モルグ。

これは、非キャプチャに適しています-\b(?:(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b
APPY

3
され09.09.09.09、有効なIPと見なさ?また、この正規表現と一致します。ただし、pingはのようなエラーメッセージをスローしますping: cannot resolve 09.09.09.09: Unknown host。マッチングをドット10進表記マッチングのみに減らすのが賢明かもしれないと思います。このエントリでは、IPアドレスの主要なエラーについて説明します。
RuifengMa19年

82
^((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]?)$

受け入れる

127.0.0.1
192.168.1.1
192.168.1.255
255.255.255.255
0.0.0.0
1.1.1.01        # This is an invalid IP address!

拒否

30.168.1.255.1
127.1
192.168.1.256
-1.2.3.4
1.1.1.1.
3...3

単体テストでオンラインで試す:https//www.debuggex.com/r/-EDZOqxTxhiTncN6/1


「3 ... 3」のIPアドレスはどうですか?3 ... 3は、この正規表現を使用して受け入れられます
Ankur Loriya 2014年

8
1.1.1.01はどうですか?有効なIPv4アドレスと見なされますか?ありがとう。
odieatla 2015年

この正規表現1.1.1.01は、有効なIPv4アドレスと見なされます。オンラインユニットは、テストdebuggex.com/r/-EDZOqxTxhiTncN6/1
Sllouyssgort

途中で^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}$同じ結果を得るdebuggex.com/r/mz_-0dEm3wseIKqK @マークByersの答えとかなり類似した、
Sllouyssgort

@PriteshAcharyaここでは問題なく動作します。
キッドダイアモンド

41

最新、最短、読みにくいバージョン(55文字

^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$

このバージョンは250-5のケースを探し、その後、ケースのすべての可能なケースを巧みにORします200-249 100-199 10-99。この|)部分は間違いではありませんが、実際には0〜9の範囲の最後のケースのORであることに注意してください。また?:、キャプチャされたアイテムはあまり気にしないため、キャプチャされていないグループの部分も省略しました。そもそもフルマッチがなかった場合、どちらの方法でもキャプチャされません。

古くて短いバージョン(読みにくい)(63文字

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

古い(読み取り可能な)バージョン(70文字

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

ネガティブルックアヘッド(?!)を使用して、IPがで終わる可能性があるケースを削除します。.

最も古い答え(115文字

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

これは最も正確で厳密な正規表現だと思い000.021.01.0.ます。ここにある他のほとんどの回答のように受け入れられず、それに類似したケースを拒否するために追加の正規表現が必要です。つまり、0開始番号とで終わるIPです。.


これは、この日付までのこのスレッドでの唯一の正解です。他のアドレスは、999.999.999.999の0.0.0.0ような8進数と10進数の混合表記を見逃したり、受け入れ033.033.33.033たりします。この回答よりも10文字短いこの正規表現はどうですか?(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
2017

1
@tinmarino有効なアドレスではない192.168.000.1のようなものを許可したため、編集を元に戻しました。この回答を編集したい人は、このような問題を回避するために、最初にここにコメントしてください-私は通常、かなり速く返信します。もちろん、常により短い/より良い解決策を探しています。
DanailGabenski19年

1
メモリ用@DanailGabenski(およびその他)は、あなたが最後に交換し、それを解く[01]?[0-9][0-9]?ことで1[0-9]{2}|[1-9]?[0-9]、あなたが好きではないので、0をリードします。もう一度ありがとう!私はあなたの解決策を私の正規表現マスターの荷物に入れておきます。
Tinmarino

1
@tinmarinoはい、ipv4の標準となったドット10進形式ですが、正式には受け入れられていませんが、以下をご覧ください。具体的には、ドラフトが提案されたが期限切れになったポイント3。検証が非常に厳密である2番目の理由は、UIに表示されたときに、23ではなく023のような10進数以外の数値を持つIPが、これが間違い/バグであるとユーザーに思わせることです。また、重複などを避けるために023を23に変換する必要があるため、検証/セキュリティの問題も発生します。改善に努めていただきありがとうございます。
DanailGabenski19年

1
あなたはアウトファクタリングことによってそれを短くすることができます[0-9]のために2[0-4]1と短い例。 ^(?:(25[0-5]|(?:2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$
クレイトン・シン

11

IPv4アドレス(正確なキャプチャ)0.0.0.0から255.255.255.255に一致しますが、1.1.000.1などの無効なアドレスをキャプチャします。この正規表現を使用して、IP番号を正確に一致させます。4つの番号はそれぞれキャプチャグループに保存されるため、さらに処理するためにそれらにアクセスできます。

\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

JGsoftRegexBuddyライブラリから取得

編集:この(\.|$)部分は奇妙に見える


2
いいね!私はうまくいくように見えるもののより効率的な修正を行いました:"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$){4}\b-ありがとう!
マシューカルティエ

2
@MatthieuCartierあなたの効率的な正規表現パターンは私には
うまくいき

1
255.255.255.000が有効なIPではありません
ステファン・グリオン

6

私はIPv4アドレスに似たものを探していました-一般的に使用されるプライベートIPアドレス(192.168.xy、10.xyz、172.16.xy)の検証も停止する正規表現なので、これを達成するためにネガティブルックアヘッドを使用しました:

(?!(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.).*)
(?!255\.255\.255\.255)(25[0-5]|2[0-4]\d|[1]\d\d|[1-9]\d|[1-9])
(\.(25[0-5]|2[0-4]\d|[1]\d\d|[1-9]\d|\d)){3}

(もちろん、これらは1行で、読みやすくするために3行でフォーマットする必要があります) 正規表現の視覚化

Debuggexデモ

速度が最適化されていない可能性がありますが、「実際の」インターネットアドレスのみを検索する場合はうまく機能します。

失敗する(そして失敗する)もの:

0.1.2.3         (0.0.0.0/8 is reserved for some broadcasts)
10.1.2.3        (10.0.0.0/8 is considered private)
172.16.1.2      (172.16.0.0/12 is considered private)
172.31.1.2      (same as previous, but near the end of that range)
192.168.1.2     (192.168.0.0/16 is considered private)
255.255.255.255 (reserved broadcast is not an IP)
.2.3.4
1.2.3.
1.2.3.256
1.2.256.4
1.256.3.4
256.2.3.4
1.2.3.4.5
1..3.4

動作する(および動作するはずの)IP:

1.0.1.0         (China)
8.8.8.8         (Google DNS in USA)
100.1.2.3       (USA)
172.15.1.2      (USA)
172.32.1.2      (USA)
192.167.1.2     (Italy)

他の誰かが「共通のプライベートアドレスを含まないインターネットIPアドレス」の検証を探している場合に提供されます


5

この投稿を読んでいる多くの人は、技術的に無効なIPアドレスと一致していても、より単純な正規表現を探していると思います。(そして、他の場所で述べたように、正規表現はおそらくIPアドレスを適切に検証するための適切なツールではありません。)

削除^や、該当する場合、交換する$\b、あなたが行の先頭/末尾と一致しない場合。

基本正規表現(BRE)(GNU grep、GNU sed、およびvimでテスト済み):

/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/

拡張正規表現(ERE):

/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/

または:

/^([0-9]+(\.|$)){4}/

Perl互換の正規表現(PCRE)(Perl 5.18でテスト済み):

/^\d+\.\d+\.\d+\.\d+$/

または:

/^(\d+(\.|$)){4}/

Ruby(Ruby 2.1でテスト済み):

PCREであるはずですが、Rubyは何らかの理由で、Perl5.18では許可されていないこの正規表現を許可しました。

/^(\d+[\.$]){4}/

これらすべての私のテストはここでオンラインです


3

これはいくつかより少し長いですが、これは私がIPv4アドレスを照合するために使用するものです。妥協のないシンプル。

^((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])$

3

上記の回答は有効ですが、IPアドレスが行末ではなく、テキストの間にある場合はどうなりますか。この正規表現はそれでも機能します。

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

入力テキストファイル:

ip address 0.0.0.0 asfasf
 sad sa 255.255.255.255 cvjnzx
zxckjzbxk  999.999.999.999 jshbczxcbx
sjaasbfj 192.168.0.1 asdkjaksb
oyo 123241.24121.1234.3423 yo
yo 0000.0000.0000.0000 y
aw1a.21asd2.21ad.21d2
yo 254.254.254.254 y0
172.24.1.210 asfjas
200.200.200.200
000.000.000.000
007.08.09.210
010.10.30.110

出力テキスト:

0.0.0.0
255.255.255.255
192.168.0.1
254.254.254.254
172.24.1.210
200.200.200.200

1
私が投票するまで、これは否定的にマークされました。私はこれを正確に実行しようとしています(私が認めたいよりも長い時間)。1つのラインに複数のドットクワッドがあるラインはキャプチャされませんが、私のユースケースでは、それを使用できます。これは素晴らしい答えです、もっと投票が必要です!
倒置

3

'' 'このコードは私のために機能し、それと同じくらい簡単です。

ここでは、ipの値を取得し、それを正規表現と一致させようとしています。

ip="25.255.45.67"    

op=re.match('(\d+).(\d+).(\d+).(\d+)',ip)

if ((int(op.group(1))<=255) and (int(op.group(2))<=255) and int(op.group(3))<=255) and (int(op.group(4))<=255)):

print("valid ip")

else:

print("Not valid")

上記の条件では、4つのオクテットすべてで値が255を超えているかどうかがチェックされ、無効になります。ただし、値は文字列であるため、条件を適用する前に、それらを整数に変換する必要があります。

group(0)は一致した出力を出力しますが、group(1)は最初に一致した値を出力し、ここでは「25」というように続きます。'' '


StackOverflowへようこそ。あなたの答えがOPの問題を解決する必要がある理由についていくつかの言葉を費やすことができれば、素晴らしいでしょう。唯一のコードの答えは、仲間のコーダーが彼らが間違ったことを理解するのを助けないので、一般的に悪い答えです。
DavideVitali19年

コードに適切なインデントを使用して、ユーザーが読みやすくする
Syed MehtabHassan19年


2

0から255までの番号には、次の正規表現を使用します。

(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))

上記の正規表現は0から255までの整数に一致しますが、256には一致しません。

したがって、IPv4の場合、私はこの正規表現を使用します。

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

これは次の構造にあります。^(N)((\.(N)){3})$ここで、Nは0から255までの数値を照合するために使用される
正規表現です。この正規表現は次のようにIPと照合されます。

0.0.0.0
192.168.1.2

ただし、以下のものではありません。

10.1.0.256
1.2.3.
127.0.1-2.3

IPv4 CIDR(クラスレスドメイン間ルーティング)の場合、次の正規表現を使用します。

^(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))((\.(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))){3})\/(([0-9])|([12][0-9])|(3[0-2]))$

これは次の構造にあります。^(N)((\.(N)){3})\/M$ここで、Nは0から255までの数値を照合するために使用される正規表現であり、Mは0から32までの数値を照合するために使用される
正規表現です。この正規表現は次のようにCIDRと一致します。

0.0.0.0/0
192.168.1.2/32

ただし、以下のものではありません。

10.1.0.256/16
1.2.3./24
127.0.0.1/33

そして、"10.0.0.0/16", "192.168.1.1/32"私がこの正規表現を使用するようなIPv4CIDRのリストについては:

^("(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))((\.(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))){3})\/(([0-9])|([12][0-9])|(3[0-2]))")((,([ ]*)("(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))((\.(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))){3})\/(([0-9])|([12][0-9])|(3[0-2]))"))*)$

これは次の構造にあります。^(“C”)((,([ ]*)(“C”))*)$ここで、CはCIDRの一致に使用される正規表現です(0.0.0.0/0など)。
この正規表現は、以下のようにCIDRのリストと一致します。

“10.0.0.0/16”,”192.168.1.2/32”, “1.2.3.4/32”

ただし、以下のものではありません。

“10.0.0.0/16” 192.168.1.2/32 “1.2.3.4/32”

短くなるかもしれませんが、私にとってはとてもわかりやすいです。

それが役に立てば幸い!


SOへようこそ、ご意見ありがとうございます!別の正規表現(特に最後の正規表現)が何をしているのか、少し詳しく説明していただけますか?
B -リアン

1

私は他のすべての答えから正規表現を構築することができました。

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

IEEE 802.xイーサネット標準によると、IP検証はIP範囲0.xxxです>>>許可されるべきではありません-無効なIP。#1.IP範囲は1.xxxから126.xxxで始まります>>>>構成を許可できます。#2.IP範囲127.xxx >>>>は許可されるべきではありません-無効なIP。#3.IP範囲128.xxx〜223.xxx >>の構成を許可できます。より良い処理方法は次のように提案されています:^(22 [0-3] | 2 [0-1] [0-9] | [1] [0-9] [0-9]?| [1-9 ] [0-9] | [1-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-4] | 2 [0-4] [0-9] | [01]?[0-9] [0-9]?)$
YogeshAggarwal20年

1

サブネットマスク付き:

^$|([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\
.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\
.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\
.([01]?\\d\\d?|2[0-4]\\d|25[0-5])
((/([01]?\\d\\d?|2[0-4]\\d|25[0-5]))?)$

1
(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.){3}(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2})))

テキスト内の一致を見つけるためのテスト、 https://regex101.com/r/9CcMEN/2

以下は、IPアドレスの各番号の有効な組み合わせを定義するルールです。

  • 1桁または2桁の数字。
  • で始まる3桁の数字1

  • 22桁目が。0 までの場合で始まる3桁の数字4

  • 253桁目が。0 までの場合で始まる3桁の数字5

Let'start (((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.)、4つのネストされた部分式のセットを、私たちは逆の順序でそれらを見てみましょう。(\d{1,2})任意の1桁または2桁の番号または番号と一致する0スルー99(1\d{2})始まる3桁の番号と一致する11任意の二つの数字が続く)を、または数字100を介し199(2[0-4]\d)数字と一致し200249(25[0-5])数字と一致し250255。これらの各部分式は|、それぞれの間にある別の部分式で囲まれています(したがって、4つの部分式のすべてではなく、1つが一致する必要があります)。数字の範囲が\.一致.した後、シリーズ全体(すべての数字オプションに加えて\.)はさらに別の部分式に囲まれ、{3}。を使用して3回繰り返されます。最後に、番号の範囲が繰り返され(今回は末尾なし\.)、最終的なIPアドレス番号と一致します。間の値に4つの数のそれぞれを制限することにより0、および255、このパターンは確かに有効なIPアドレスが一致し、無効なアドレスを拒否することができます。

抜粋:ベンフォルタ。「正規表現の学習」。


文字どちらもIPアドレスの先頭にも終わりたかった、された場合^$メタ文字は、それぞれ、使用されるべきです。

^(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.){3}(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2})))$

テキスト内の一致を見つけるためのテスト、 https://regex101.com/r/uAP31A/1


1

私はそれを少し単純で短くしようとしました。

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

java / kotlinをお探しの場合:

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

誰かがそれがどのように機能するか知りたいのなら、ここに説明があります。とても簡単です。試してみてください:p:

 1. ^.....$: '^' is the starting and '$' is the ending.

 2. (): These are called a group. You can think of like "if" condition groups.

 3. |: 'Or' condition - as same as most of the programming languages.

 4. [01]?\d{1,2}: '[01]' indicates one of the number between 0 and 1. '?' means '[01]' is optional. '\d' is for any digit between 0-9 and '{1,2}' indicates the length can be between 1 and 2. So here the number can be 0-199.

 5. 2[0-4]\d: '2' is just plain 2. '[0-4]' means a number between 0 to 4. '\d' is for any digit between 0-9. So here the number can be 200-249.

 6. 25[0-5]: '25' is just plain 25. '[0-5]' means a number between 0 to 5. So here the number can be 250-255.

 7. \.: It's just plan '.'(dot) for separating the numbers.

 8. {3}: It means the exact 3 repetition of the previous group inside '()'.

 9. ([01]?\d{1,2}|2[0-4]\d|25[0-5]): Totally same as point 2-6

数学的には次のようなものです。

(0-199 OR 200-249 OR 250-255).{Repeat exactly 3 times}(0-199 OR 200-249 OR 250-255)

したがって、通常ご覧のとおり、これはIPアドレスのパターンです。正規表現を少し理解するのに役立つことを願っています。:p


1

私はそれを少し単純で短くしようとしました。

^(([01]?\ d {1,2} | 2 [0-4] \ d | 25 [0-5])。){3}([01]?\ d {1,2} | 2 [0-4] \ d | 25 [0-5])$

java / kotlinをお探しの場合:

^(([01]?\ d {1,2} | 2 [0-4] \ d | 25 [0-5])\。){3}([01]?\ d {1,2} | 2 [0-4] \ d | 25 [0-5])$

誰かがそれがどのように機能するか知りたいのなら、ここに説明があります。とても簡単です。試してみてください:p:

 1. ^.....$: '^' is the starting and '$' is the ending.

 2. (): These are called a group. You can think of like "if" condition groups.

 3. |: 'Or' condition - as same as most of the programming languages.

 4. [01]?\d{1,2}: '[01]' indicates one of the number between 0 and 1. '?' means '[01]' is optional. '\d' is for any digit between 0-9 and '{1,2}' indicates the length can be between 1 and 2. So here the number can be 0-199.

 5. 2[0-4]\d: '2' is just plain 2. '[0-4]' means a number between 0 to 4. '\d' is for any digit between 0-9. So here the number can be 200-249.

 6. 25[0-5]: '25' is just plain 25. '[0-5]' means a number between 0 to 5. So here the number can be 250-255.

 7. \.: It's just plan '.'(dot) for separating the numbers.

 8. {3}: It means the exact 3 repetition of the previous group inside '()'.

 9. ([01]?\d{1,2}|2[0-4]\d|25[0-5]): Totally same as point 2-6

数学的には次のようなものです。

(0-199 OR 200-249 OR 250-255).{Repeat exactly 3 times}(0-199 OR 200-249 OR 250-255)

したがって、通常ご覧のとおり、これはIPアドレスのパターンです。正規表現を少し理解するのに役立つことを願っています。:p


0
    const char*ipv4_regexp = "\\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";

JGsoft RegexBuddyライブラリから取得した正規表現をC言語(regcomp / regexec)に適合させたところ、機能することがわかりましたが、Linuxなどの一部のOSでは少し問題があります。その正規表現は、192.168.100.009のようなipv4アドレスを受け入れます。Linuxでは009は8進値と見なされるため、アドレスは思ったものではありません。その正規表現を次のように変更しました。

    const char* ipv4_regex = "\\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
           "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
           "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
           "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\b";

その通常の式を使用すると、192.168.100.009は有効なipv4アドレスではなくなりますが、192.168.100.9は問題ありません。

マルチキャストアドレスの正規表現も変更しました。これは次のとおりです。

    const char* mcast_ipv4_regex = "\\b(22[4-9]|23[0-9])\\."
                        "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
                        "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]?)\\."
                        "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\b";

アプリケーションの開発に使用している言語に正規表現を適合させる必要があると思います

私はJavaで例を挙げました:

    package utility;

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class NetworkUtility {

        private static String ipv4RegExp = "\\b(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d?)\\b";

        private static String ipv4MulticastRegExp = "2(?:2[4-9]|3\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d?|0)){3}";

        public NetworkUtility() {

        }

        public static boolean isIpv4Address(String address) {
            Pattern pattern = Pattern.compile(ipv4RegExp);
            Matcher matcher = pattern.matcher(address);

            return matcher.matches();
        }

        public static boolean isIpv4MulticastAddress(String address) {
             Pattern pattern = Pattern.compile(ipv4MulticastRegExp);
             Matcher matcher = pattern.matcher(address);

             return matcher.matches();
        }
    }

0
-bash-3.2$ echo "191.191.191.39" | egrep 
  '(^|[^0-9])((2([6-9]|5[0-5]?|[0-4][0-9]?)?|1([0-9][0-9]?)?|[3-9][0-9]?|0)\.{3}
     (2([6-9]|5[0-5]?|[0-4][0-9]?)?|1([0-9][0-9]?)?|[3-9][0-9]?|0)($|[^0-9])'

>> 191.191.191.39

(これは、アドレス空間全体(ブロードキャストなどを含む)に一致するDFAです。



0

このサンプルは非常に便利であり、さらにさまざまなipv4表記が可能です。

Pythonを使用したサンプルコード:

    def is_valid_ipv4(ip4):
    """Validates IPv4 addresses.
    """
    import re
    pattern = re.compile(r"""
        ^
        (?:
          # Dotted variants:
          (?:
            # Decimal 1-255 (no leading 0's)
            [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
          |
            0x0*[0-9a-f]{1,2}  # Hexadecimal 0x0 - 0xFF (possible leading 0's)
          |
            0+[1-3]?[0-7]{0,2} # Octal 0 - 0377 (possible leading 0's)
          )
          (?:                  # Repeat 0-3 times, separated by a dot
            \.
            (?:
              [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
            |
              0x0*[0-9a-f]{1,2}
            |
              0+[1-3]?[0-7]{0,2}
            )
          ){0,3}
        |
          0x0*[0-9a-f]{1,8}    # Hexadecimal notation, 0x0 - 0xffffffff
        |
          0+[0-3]?[0-7]{0,10}  # Octal notation, 0 - 037777777777
        |
          # Decimal notation, 1-4294967295:
          429496729[0-5]|42949672[0-8]\d|4294967[01]\d\d|429496[0-6]\d{3}|
          42949[0-5]\d{4}|4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|
          4[01]\d{8}|[1-3]\d{0,9}|[4-9]\d{0,8}
        )
        $
    """, re.VERBOSE | re.IGNORECASE)
    return pattern.match(ip4) <> None

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

この正規表現は、08.8.8.8または8.08.8.8または8.8.08.8または8.8.8.08を受け入れません。


これは、たとえば127.0.0.1と0.0.0.0を見逃しています
2017

^((\。| ^)(25 [0-5] | 2 [0-4] [0-9] | 1 [0-9] [0-9] | [1-9] [0-9] ?| [0-9]?| 0))((\。| ^)(25 [0-5] | 2 [0-4] [0-9] | 1 [0-9] [0-9] | [1-9] [0-9]?| 0)){2}。((25 [0-5] | 2 [0-4] [0-9] | 1 [0-9] [0- 9] | [1-9] [0-9]?| 0)$)
sudistack 2017

1
仕様によれば、先行ゼロを拒否するのは正しいことです。
John Haugeland 2017年

0

IPが数字以外の文字(IPの後ろまたは前)にラップされている限り、有効なIPアドレスを検索します。4つの後方参照が作成されました:$ + {first}。$ + {second}。$ + {third}。$ + {forth}

Find String:
#any valid IP address
(?<IP>(?<![\d])(?<first>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))
#only valid private IP address RFC1918
(?<IP>(?<![\d])(:?(:?(?<first>10)[\.](?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5])))|(:?(?<first>172)[\.](?<second>(:?1[6-9])|(:?2[0-9])|(:?3[0-1])))|(:?(?<first>192)[\.](?<second>168)))[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))

Notepad++ Replace String Option 1: Replaces the whole IP (NO Change):
$+{IP}

Notepad++ Replace String Option 2: Replaces the whole IP octect by octect (NO Change)
$+{first}.$+{second}.$+{third}.$+{forth}

Notepad++ Replace String Option 3: Replaces the whole IP octect by octect (replace 3rd octect value with 0)
$+{first}.$+{second}.0.$+{forth}
NOTE: The above will match any valid IP including 255.255.255.255 for example and change it to 255.255.0.255 which is wrong and not very useful of course.

各オクテクトの一部を実際の値に置き換えますが、独自の検索と置換を作成できます。これは、テキストファイルのIPを修正するのに実際に役立ちます。

for example replace the first octect group of the original Find regex above:
(?<first>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))
with
(?<first>10)

and
(?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))
with
(?<second>216)
and you are now matching addresses starting with first octect 192 only

Find on notepad++:
(?<IP>(?<![\d])(?<first>10)[\.](?<second>216)[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))

以前とまったく同じ方法で、バックリファレンスグループを使用して置換を実行することもできます。

上記がどのように一致したかを以下で理解できます。

cat ipv4_validation_test.txt
Full Match:
0.0.0.1
12.108.1.34
192.168.1.1
10.249.24.212
10.216.1.212
192.168.1.255
255.255.255.255
0.0.0.0


Partial Match (IP Extraction from line)
30.168.1.0.1
-1.2.3.4
sfds10.216.24.23kgfd
da11.15.112.255adfdsfds
sfds10.216.24.23kgfd


NO Match
1.1.1.01
3...3
127.1.
192.168.1..
192.168.1.256
da11.15.112.2554adfdsfds
da311.15.112.255adfdsfds

grepを使用すると、以下の結果を確認できます。

From grep:
grep -oP '(?<IP>(?<![\d])(?<first>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))' ipv4_validation_test.txt
0.0.0.1
12.108.1.34
192.168.1.1
10.249.24.212
10.216.1.212
192.168.1.255
255.255.255.255
0.0.0.0
30.168.1.0
1.2.3.4
10.216.24.23
11.15.112.255
10.216.24.23


grep -P '(?<IP>(?<![\d])(?<first>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))' ipv4_validation_test.txt
0.0.0.1
12.108.1.34
192.168.1.1
10.249.24.212
10.216.1.212
192.168.1.255
255.255.255.255
0.0.0.0
30.168.1.0.1
-1.2.3.4
sfds10.216.24.23kgfd
da11.15.112.255adfdsfds
sfds10.216.24.23kgfd


#matching ip addresses starting with 10.216
grep -oP '(?<IP>(?<![\d])(?<first>10)[\.](?<second>216)[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))' ipv4_validation_test.txt
10.216.1.212
10.216.24.23
10.216.24.23

0

IPv4アドレスは非常に複雑なものです。

:インデントと裏地は説明のみを目的としており、実際の正規表現には存在しません。

\b(
  ((
    (2(5[0-5]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])
  |
    0[Xx]0*[0-9A-Fa-f]{1,2}
  |
    0+[1-3]?[0-9]{1,2}
  )\.){1,3}
  (
    (2(5[0-5]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])
  |
    0[Xx]0*[0-9A-Fa-f]{1,2}
  |
    0+[1-3]?[0-9]{1,2}
  )
|
  (
    [1-3][0-9]{1,9}
  |
    [1-9][0-9]{,8}
  |
    (4([0-1][0-9]{8}
      |2([0-8][0-9]{7}
        |9([0-3][0-9]{6}
          |4([0-8][0-9]{5}
            |9([0-5][0-9]{4}
              |6([0-6][0-9]{3}
                |7([0-1][0-9]{2}
                  |2([0-8][0-9]{1}
                    |9([0-5]
    ))))))))))
  )
|
  0[Xx]0*[0-9A-Fa-f]{1,8}
|
  0+[1-3]?[0-7]{,10}
)\b

これらのIPv4アドレスは、上記の正規表現によって検証されます。

127.0.0.1
2130706433
0x7F000001
017700000001
0x7F.0.0.01 # Mixed hex/dec/oct
000000000017700000001 # Have as many leading zeros as you want
0x0000000000007F000001 # Same as above
127.1
127.0.1

これらは拒否されます。

256.0.0.1
192.168.1.099 # 099 is not a valid number
4294967296 # UINT32_MAX + 1
0x100000000
020000000000

0

^((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]?))$


上記は、次のようなIPアドレスの正規表現になります:221.234.0.112、221.24.03.112、221.234.0.1の場合も221.234.000.112


あなたは上記のようにあらゆる種類の住所を想像することができます


0

PCREとdefineキーワードを使用します:

/^
 ((?&byte))\.((?&byte))\.((?&byte))\.((?&byte))$
 (?(DEFINE)
     (?<byte>25[0-5]|2[0-4]\d|[01]?\d\d?))
/gmx

デモ:https//regex101.com/r/IB7j48/2

これは、(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)パターンを4回繰り返さないようにするためです。以下のような他のソリューションはうまく機能しますが、多くの人から要求されるため、各グループをキャプチャしません。

/^((\d+?)(\.|$)){4}/ 

4つのキャプチャグループを作成する他の唯一の方法は、パターンを4回繰り返すことです。

/^(?<one>\d+)\.(?<two>\d+)\.(?<three>\d+)\.(?<four>\d+)$/

したがって、perlでipv4をキャプチャするのは非常に簡単です。

$ echo "Hey this is my IP address 138.131.254.8, bye!" | \
  perl -ne 'print "[$1, $2, $3, $4]" if \
    /\b((?&byte))\.((?&byte))\.((?&byte))\.((?&byte))
     (?(DEFINE)
        \b(?<byte>25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))
    /x'

[138, 131, 254, 8]

0

私が想像できる最も正確でわかりやすくコンパクトなIPv4正規表現は

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

しかし、パフォーマンス/効率についてはどうですか...申し訳ありませんが、誰が気にしますか?


0

これを試して:

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

0
ip address can be from 0.0.0.0 to 255.255.255.255

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

(0|1)?[0-9][0-9]? - checking value from 0 to 199
2[0-4][0-9]- checking value from 200 to 249
25[0-5]- checking value from 250 to 255
[.] --> represent verify . character 
{3} --> will match exactly 3
$ --> end of string

0

以下は、IPアドレスを検証するための正規表現です。

^((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]?)$

0

簡単な方法

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

デモ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.