私は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つのグループを決定する方法を示しているように見えます。
すでに有効な答えがありますが、元のアプローチで何が間違っていたのか知りたい場合は、選択肢の周りに括弧が必要です。そうでなければ、(\.|$)
は200未満の場合にのみ必要です。
'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\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]?)$
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
正規表現はこの仕事のツールではありません。 4つの数値を分離し、それらが[0,255]の範囲内にあることを確認するパーサーを作成することをお勧めします。機能していない正規表現はすでに判読できません!
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ライブラリから取得
編集:この(\.|$)
の部分は奇妙だ
私は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行である必要があります)
速度が最適化されていない可能性がありますが、「実際の」インターネットアドレスを検索する場合にのみ有効です。
失敗する(そして失敗する)もの:
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アドレス」の検証を探している場合に提供
この投稿を読んでいる多くの人は、たとえ技術的に無効な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 。
これはいくつかよりも少し長いですが、これは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])$
'' 'このコードは私のために機能し、それと同じくらい簡単です。
ここで、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」などです。 '' '
上記の答えは有効ですが、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
他のすべての回答から正規表現を構築することができました。
(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}
/^(?:(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?1)$/m
(((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
で始まる3桁の数字。
2桁目が2
から0
の場合、4
で始まる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つの数値のそれぞれを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
サブネットマスク付き:
^$|([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]))?)$
-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です。
これを試して:
\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から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”
短くなるかもしれませんが、私にとってはとてもうまく理解できます。
それが役に立てば幸い!
これは有効な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
このページには非常に悪い正規表現がありました。
\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
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();
}
}
^((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
上記のあらゆる種類の住所を想像できます
このサンプルは非常に便利であり、さらにさまざまな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
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
私が想像できる最も正確で簡単でコンパクトな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)$
しかし、パフォーマンス/効率についてはどうですか...申し訳ありませんが、誰が気にしますか?
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]
これが一番短いと思います。
^(([01]?\d\d?|2[0-4]\d|25[0-5]).){3}([01]?\d\d?|2[0-4]\d|25[0-5])$
簡単な方法
((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})
((\.|^)(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を受け入れません。
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
以下は、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]?)$