web-dev-qa-db-ja.com

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

私は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つのグループを決定する方法を示しているように見えます。

56

すでに有効な答えがありますが、元のアプローチで何が間違っていたのか知​​りたい場合は、選択肢の周りに括弧が必要です。そうでなければ、(\.|$)は200未満の場合にのみ必要です。

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

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

Accept

127.0.0.1
192.168.1.1
192.168.1.255
255.255.255.255
0.0.0.0
1.1.1.01

拒否

30.168.1.255.1
127.1
192.168.1.256
-1.2.3.4
3...3

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

55
Sllouyssgort

正規表現はこの仕事のツールではありません。 4つの数値を分離し、それらが[0,255]の範囲内にあることを確認するパーサーを作成することをお勧めします。機能していない正規表現はすでに判読できません!

29
Tim

IPv4アドレス(正確なキャプチャ)0.0.0.0〜255.255.255.255に一致この正規表現を使用して、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

jGsoft RegexBuddyライブラリから取得

編集:この(\.|$)の部分は奇妙だ

9
Valerij

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

(?!(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}

(これらは読みやすくするために3行にフォーマットされていることはもちろん、1行である必要があります) Regular expression visualization

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
PhillipHolmes

この投稿を読んでいる多くの人は、たとえ技術的に無効な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は何らかの理由で、Perl 5.18で許可されていないこの正規表現を許可しました。

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

これらすべてのテストはオンラインで行われます here

3
Alex Harvey

これはいくつかよりも少し長いですが、これは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
Mickstar

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

ここで、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」などです。 '' '

1
Shruti Lakkihal

上記の答えは有効ですが、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
Kushagra Gupta

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

(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}
1
Vicky
/^(?:(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?1)$/m
1
Etienne Gautier
(((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桁の数字。
  • 1で始まる3桁の数字。

  • 2桁目が2から0の場合、4で始まる3桁の数字。

  • 3桁目が25から0の場合、5で始まる3桁の数字。

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

抜粋: Ben Forta。「正規表現の学習」


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
snr

サブネットマスク付き:

^$|([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
hsuk
-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
Jonathzen

これを試して:

\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
AAP

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"のような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]))")((,([ ]*)("(([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”

短くなるかもしれませんが、私にとってはとてもうまく理解できます。

それが役に立てば幸い!

0
congacon

これは有効なIPのみに一致し(先頭に0を付加しませんが、「機能」[予約、プライベートなど]に関係なく0-255のオクテットに一致します)、インライン一致を許可します。 IPの後、またはCIDR表記を使用する場合。

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

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< '10.0.1.2'
10.0.1.2

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< 'ip address 10.0.1.2'
ip address 10.0.1.2

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< 'ip address 10.0.1.2 255.255.255.255'
ip address 10.0.1.2 255.255.255.255

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< 'ip address 10.0.1.2/32'
ip address 10.0.1.2/32

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< 'ip address 10.0.1.2.32'
$

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< 'ip address10.0.1.2'
$

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< '10.0.1.256'
$

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< '0.0.0.0'
0.0.0.0

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< '255.255.255.255'
255.255.255.255

$ grep -E '(^| )((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($| |/)' <<< '255.255.255.256'
$

もちろん、IPがインラインの場合、IP全体のみが必要で、IPのみが必要な場合は、grepオプション「-o」と空白トリマーの設定を使用できます。

Pythonを使用している私たちにとって、同等のものはおおよそ次のとおりです。

>>> ipv4_regex = re.compile(r'(^| )((?:[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])($| |/)')
>>> ipv4_regex.search('ip address 10.1.2.3/32')
<re.Match object; span=(10, 20), match=' 10.1.2.3/'>

私のようにうるさい(怠lazな)場合は、おそらくグループ化を使用してIP全体を取得し、IPのみを取得するか、CIDRを取得し、CIDRのみを取得するか、それらの組み合わせを使用することをお勧めします。 (?P)構文 を使用して、参照しやすいようにグループに名前を付けることができます。

>>> ipv4_regex = re.compile(r'(?:^| )(?P<address>((?:[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]))(?P<slash>/)?(?(slash)(?P<cidr>[0-9]|[12][0-9]|3[0-2]))(?:$| )')
>>> match = ipv4_regex.search('ip address 10.0.1.2/32')
>>> match.group('address')
'10.0.1.2'
>>> match.group('cidr')
'32'
>>> "".join((match.group('address'), match.group('slash'), match.group('cidr')))
'10.0.1.2/32'

もちろん、正規表現だけを使用しない方法もあります。確認できる条件を次に示します(これはインラインではなく、渡されたアドレスが有効であることを検証するだけです)。

最初のチェックは、アドレスの各文字が数字または「。」であることです。

次に、正確に3つの '。'があることを確認します。

次の2つのチェックでは、各オクテットが0〜255であることを確認します。

最後のチェックは、オクテットに「0」が付加されていないことです。

def validate_ipv4_address(address):
    return all(re.match('\.|\d', c) for c in address) \
        and address.count('.') == 3 \
        and all(0 <= int(octet) <= 255 for octet in address.split('.')) \
        and all((len(bin(int(octet))) <= 10 for octet in address.split('.'))) \
        and all(len(octet) == 1 or d[0] != '0' for octet in address.split('.'))


>>> validate_ipv4_address('255.255.255.255')
True
>>> validate_ipv4_address('10.0.0.1')
True
>>> validate_ipv4_address('01.01.01.01')
False
>>> validate_ipv4_address('123.456.789.0')
False
>>> validate_ipv4_address('0.0.0.0')
True
>>> validate_ipv4_address('-1.0.0.0')
False
>>> validate_ipv4_address('1.1.1.')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in validate_ipv4_address
  File "<stdin>", line 4, in <genexpr>
ValueError: invalid literal for int() with base 10: ''
>>> validate_ipv4_address('.1.1.1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in validate_ipv4_address
  File "<stdin>", line 4, in <genexpr>
ValueError: invalid literal for int() with base 10: ''
>>> validate_ipv4_address('1..1.1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in validate_ipv4_address
  File "<stdin>", line 4, in <genexpr>
ValueError: invalid literal for int() with base 10: ''

(ビット単位で、各オクテットは8ビット以下にする必要がありますが、それぞれに「0b」が追加されます)

>>> bin(0)
'0b0'
>>> len(bin(0))
3
>>> bin(255)
'0b11111111'
>>> len(bin(256))
11
0
Jason Shaffner

このページには非常に悪い正規表現がありました。

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

説明:

num-group = (0-9|10-99|100-199|200-249|250-255)
<border> + { <num-group> + <dot-cahracter> }x3 + <num-group> + <border>

ここで、それがどのように機能するかを確認できます here

0
Martin Mlích
    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
Fabio Stafforte

^((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.000.112 221.234.0.112、221.24.03.112、221.234.0.1


上記のあらゆる種類の住所を想像できます

0
Ram Sharma

このサンプルは非常に便利であり、さらにさまざまな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
internety

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
rda

私が想像できる最も正確で簡単でコンパクトな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
fuweichin

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
nowox

これが一番短いと思います。

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

簡単な方法

((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})

デモ

0
BabiBN
((\.|^)(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を受け入れません。

0
sudistack
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
Dilip Paudel