Memvalidasi alamat IPv4 dengan regexp

91

Saya telah mencoba mendapatkan regex yang efisien untuk validasi IPv4, tetapi tidak berhasil. Tampaknya pada satu titik saya memilikinya (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}, tetapi menghasilkan beberapa hasil yang aneh:

$ 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

Saya melakukan pencarian untuk melihat apakah ini sudah ditanyakan dan dijawab, tetapi jawaban lain tampaknya hanya menunjukkan cara menentukan 4 kelompok nomor 1-3, atau tidak berfungsi untuk saya.

Matthieu Cartier
sumber
12
Jangan lupa bahwa A, dan AB, dan ABC adalah bentuk alamat IP yang valid serta ABCD. Serius. Coba ping 2130706433dan ping 127.1cekikikan.
Dty
1
Varian saya online regexr.com/39hqf
Sllouyssgort

Jawaban:

98

Anda sudah mendapatkan jawaban yang berfungsi tetapi jika Anda ingin tahu apa yang salah dengan pendekatan awal Anda, jawabannya adalah Anda memerlukan tanda kurung di sekitar pergantian Anda, jika tidak, (\.|$)hanya diperlukan jika jumlahnya kurang dari 200.

'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b'
    ^                                    ^
Mark Byers
sumber
25
ini tampaknya juga memvalidasi hal-hal seperti192.168.1.1.1
cwd
2
Haruskah itu \b((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:(?<!\.)\b|\.)){4}:; yaitu sehingga diakhiri dengan batas kata dan bukan dengan akhir baris? Selain itu di sini saya telah menandai grup yang tidak menangkap untuk menghindari sub-pertandingan yang tidak diinginkan. NB: Ini masih belum memperhitungkan komentar @ dty karena saya tidak paham dengan bentuk IP tersebut; meskipun dia benar bahwa itu tampaknya valid.
JohnLBevan
Anda mungkin ingin mencoba ini sebagai gantinya: ((1? \ D \ d? | 2 [0-4] \ d | 25 [0-5]) \.) {3} (1? \ D \ d? | 2 [0-4] \ d | 25 [0-5])
Morg.
Ini bekerja dengan baik untuk non-capture -\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
Apakah 09.09.09.09dianggap sebagai IP yang valid? Itu juga dicocokkan dengan regex ini. Tapi ping melempar pesan kesalahan seperti ping: cannot resolve 09.09.09.09: Unknown host. Saya pikir mungkin bijaksana untuk mengurangi pencocokan menjadi hanya pencocokan notasi titik-desimal. Entri ini membahas tentang kesalahan utama dalam alamat IP.
Ruifeng Ma
79
^((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]?)$

Terima :

127.0.0.1
192.168.1.1
192.168.1.255
255.255.255.255
0.0.0.0
1.1.1.01

Tolak :

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

Coba online dengan tes unit: https://www.debuggex.com/r/-EDZOqxTxhiTncN6/1

Sllouyssgort
sumber
bagaimana dengan alamat ip "3 ... 3"? 3 ... 3 diterima menggunakan regex ini
Ankur Loriya
7
Bagaimana dengan 1.1.1.01? Apakah ini dianggap sebagai alamat IPv4 yang valid? Terima kasih.
odieatla
regexp 1.1.1.01 ini dianggap sebagai alamat IPv4 yang VALID. Tes unit online debuggex.com/r/-EDZOqxTxhiTncN6/1
Sllouyssgort
ngomong-ngomong, ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}$dapatkan hasil yang sama debuggex.com/r/mz_-0dEm3wseIKqK , sangat mirip dengan jawaban
@Mark
@PriteshAcharya Bekerja dengan baik di sini.
Kid Diamond
35

Versi terbaru, terpendek, paling tidak terbaca ( 55 karakter )

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

Versi ini mencari kasing 250-5, setelah itu dengan pintar ORs semua kemungkinan kasing untuk kasing 200-249 100-199 10-99. Perhatikan bahwa |)bagian tersebut bukan kesalahan, tetapi sebenarnya OR adalah kasus terakhir untuk rentang 0-9. Saya juga menghilangkan ?:bagian grup yang tidak menangkap karena kami tidak terlalu peduli dengan item yang ditangkap, mereka tidak akan ditangkap dengan cara apa pun jika kami tidak memiliki pertandingan penuh di tempat pertama.

Versi lama dan lebih pendek (kurang terbaca) ( 63 karakter )

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

Versi lebih lama (dapat dibaca) ( 70 karakter )

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

Ini menggunakan lookahead negatif (?!)untuk menghapus kasus di mana ip mungkin diakhiri dengan.

Jawaban terlama ( 115 karakter )

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

Saya pikir ini adalah regex yang paling akurat dan ketat, tidak menerima hal-hal seperti 000.021.01.0.yang terlihat seperti kebanyakan jawaban lain di sini dan memerlukan regex tambahan untuk menolak kasus yang mirip dengan itu - yaitu 0angka awal dan ip yang diakhiri dengan a.

Danail Gabenski
sumber
Ini adalah satu-satunya jawaban yang benar di utas ini hingga saat ini. Yang lain kehilangan alamat seperti 0.0.0.0atau menerima notasi oktal / desimal campuran seperti 033.033.33.033atau bahkan memungkinkan 999.999.999.999. Bagaimana dengan regex ini yang 10 karakter lebih pendek dari jawaban ini:(([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])
anneb
1
@tinmarino Saya mengembalikan hasil edit Anda karena mengizinkan hal-hal seperti 192.168.000.1 yang bukan alamat yang valid. Siapapun yang ingin menyunting jawaban ini, silakan beri komentar terlebih dahulu di sini untuk menghindari masalah seperti ini - Saya biasanya membalas dengan cukup cepat. Selalu mencari solusi yang lebih singkat / lebih baik tentunya.
Danail Gabenski
1
@DanailGabenski (dan lainnya) untuk memori, Anda menyelesaikannya dengan menggantinya [01]?[0-9][0-9]?dengan yang terakhir 1[0-9]{2}|[1-9]?[0-9]karena Anda tidak suka memimpin 0 . Terima kasih lagi! Saya akan menyimpan solusi Anda di bagasi master regex saya.
Tinmarino
1
@tinmarino ya, format titik-desimal yang telah menjadi standar untuk ipv4, meskipun tidak diterima secara resmi silakan lihat yang berikut ini . Khususnya poin 3, di mana draf disarankan tetapi kedaluwarsa. Alasan kedua untuk menjadi begitu ketat dengan validasi adalah bahwa ketika disajikan di UI, ip dengan angka non-desimal seperti 023 bukannya 23 membuat pengguna menganggap ini adalah kesalahan / bug. Ini juga menyebabkan kesulitan dengan verifikasi / keamanan karena 023 perlu diubah menjadi 23 untuk menghindari duplikat, dll. Terima kasih telah mencoba membuat segalanya lebih baik!
Danail Gabenski
1
Anda dapat membuatnya lebih pendek dengan anjak keluar [0-9]untuk 2[0-4], 1, dan lebih pendek kasus. ^(?:(25[0-5]|(?:2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$
Clayton Singh
12

Alamat IPv4 (pengambilan akurat) Cocok dengan 0.0.0.0 hingga 255.255.255.255 Gunakan regex ini untuk mencocokkan nomor IP dengan akurasi. Masing-masing dari 4 nomor tersebut disimpan ke dalam grup penangkap, sehingga Anda dapat mengaksesnya untuk diproses lebih lanjut.

\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

diambil dari perpustakaan JGsoft RegexBuddy

Sunting: (\.|$)bagian ini tampak aneh

Valerij
sumber
2
Bagus! Saya melakukan modifikasi yang lebih efisien dari yang tampaknya berhasil: "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$){4}\b- terima kasih!
Matthieu Cartier
2
@MatthieuCartier Pola regex efisien Anda tidak bekerja untuk saya,
R__raki__
255.255.255.000 bukan IP yang valid
Stéphane GRILLON
6

Saya sedang mencari sesuatu yang mirip untuk alamat IPv4 - regex yang juga menghentikan alamat ip pribadi yang umum digunakan agar tidak divalidasi (192.168.xy, 10.xyz, 172.16.xy) jadi gunakan pandangan negatif ke depan untuk mencapai ini:

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

(Ini harus dalam satu baris tentunya, diformat agar dapat dibaca pada 3 baris terpisah) Visualisasi ekspresi reguler

Demo Debuggex

Ini mungkin tidak dioptimalkan untuk kecepatan, tetapi berfungsi dengan baik saat hanya mencari alamat internet 'asli'.

Hal-hal yang akan (dan seharusnya) gagal:

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 yang akan (dan seharusnya) berfungsi:

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)

Diberikan jika ada orang lain yang mencari untuk memvalidasi 'alamat IP Internet tidak termasuk alamat pribadi umum'

PhillipHolmes
sumber
5

Saya pikir banyak orang yang membaca posting ini akan mencari ekspresi reguler yang lebih sederhana, meskipun mereka cocok dengan beberapa alamat IP yang secara teknis tidak valid. (Dan, seperti disebutkan di tempat lain, regex mungkin bukan alat yang tepat untuk memvalidasi alamat IP dengan benar.)

Hapus ^dan, jika memungkinkan, ganti $dengan \b, jika Anda tidak ingin mencocokkan awal / akhir baris.

Basic Regular Expression (BRE) (diuji pada GNU grep, GNU sed, dan vim):

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

Ekspresi Reguler yang Diperpanjang (Extended Regular Expression / ERE):

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

atau:

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

Regular Expression (PCRE) yang kompatibel dengan Perl (diuji pada Perl 5.18):

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

atau:

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

Ruby (diuji pada Ruby 2.1):

Meskipun seharusnya PCRE, Ruby untuk alasan apa pun yang mengizinkan regex ini tidak diizinkan oleh Perl 5.18:

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

Tes saya untuk semua ini online di sini .

Alex Harvey
sumber
3

Ini sedikit lebih panjang dari beberapa tapi inilah yang saya gunakan untuk mencocokkan alamat IPv4. Sederhana tanpa kompromi.

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

Jawaban di atas valid tetapi bagaimana jika alamat ip tidak ada di akhir baris dan di antara teks .. regex ini bahkan akan berfungsi untuk itu.

kode: '\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'

masukkan file teks:

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

teks keluaran:

0.0.0.0
255.255.255.255
192.168.0.1
254.254.254.254
172.24.1.210
200.200.200.200
Kushagra Gupta
sumber
1
Ini ditandai negatif, sampai saya memberikannya suara. Saya sudah mencoba melakukan hal ini selama (lebih dari yang ingin saya akui). Itu tidak akan menangkap garis yang memiliki lebih dari satu titik-quad pada satu garis, tetapi untuk kasus penggunaan saya, saya bisa menerimanya. Ini adalah jawaban yang sangat bagus, perlu lebih banyak suara!
anastrophe
3

'' 'Kode ini berfungsi untuk saya, dan sesederhana itu.

Di sini saya telah mengambil nilai ip dan saya mencoba mencocokkannya dengan regex.

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")

Kondisi di atas memeriksa apakah nilai melebihi 255 untuk semua 4 oktet maka itu tidak valid. Tetapi sebelum menerapkan kondisi kita harus mengubahnya menjadi integer karena nilainya dalam string.

group (0) mencetak keluaran yang cocok, Sedangkan group (1) mencetak nilai pertama yang cocok dan ini adalah "25" dan seterusnya. '' '

Shruti Lakkihal
sumber
Selamat datang di StackOverflow. Jika Anda bisa meluangkan beberapa kata tentang mengapa jawaban Anda harus menyelesaikan masalah OP, akan sangat bagus. Jawaban hanya dengan kode umumnya merupakan jawaban yang buruk karena tidak membantu sesama pembuat kode memahami kesalahan apa yang telah mereka lakukan.
Davide Vitali
Gunakan indentasi yang tepat dalam kode Anda agar dapat dibaca oleh pengguna
Syed Mehtab Hassan
2
/^(?:(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?1)$/m
Etienne Gautier
sumber
2

Untuk nomor dari 0 hingga 255 saya menggunakan regex ini:

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

Ekspresi reguler di atas akan cocok dengan bilangan bulat dari 0 sampai 255, tetapi tidak cocok dengan 256.

Jadi untuk IPv4 saya menggunakan regex ini:

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

Ada dalam struktur ini: di ^(N)((\.(N)){3})$mana N adalah regex yang digunakan untuk mencocokkan angka dari 0 hingga 255.
Regex ini akan cocok dengan IP seperti di bawah ini:

0.0.0.0
192.168.1.2

tapi tidak di bawah ini:

10.1.0.256
1.2.3.
127.0.1-2.3

Untuk IPv4 CIDR (Classless Inter-Domain Routing) saya menggunakan regex ini:

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

Ada dalam struktur ini: di ^(N)((\.(N)){3})\/M$mana N adalah regex yang digunakan untuk mencocokkan angka dari 0 hingga 255, dan M adalah regex yang digunakan untuk mencocokkan angka dari 0 hingga 32.
Regex ini akan cocok dengan CIDR seperti di bawah ini:

0.0.0.0/0
192.168.1.2/32

tapi tidak di bawah ini:

10.1.0.256/16
1.2.3./24
127.0.0.1/33

Dan untuk daftar IPv4 CIDR seperti "10.0.0.0/16", "192.168.1.1/32"saya menggunakan regex ini:

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

Dalam struktur ini: di ^(“C”)((,([ ]*)(“C”))*)$mana C adalah regex yang digunakan untuk mencocokkan CIDR (seperti 0.0.0.0/0).
Regex ini akan cocok dengan daftar CIDR seperti di bawah ini:

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

tapi tidak di bawah ini:

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

Mungkin itu mungkin lebih pendek tetapi bagi saya itu mudah dimengerti, jadi baik oleh saya.

Semoga membantu!

congacon
sumber
Selamat datang di SO, kami menghargai masukan Anda! Bisakah Anda menjelaskan sedikit tentang apa yang dilakukan oleh ekspresi reguler berbeda (khususnya yang terakhir)?
B - rian
1

Saya berhasil membuat ekspresi reguler dari semua jawaban lainnya.

(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}
Vicky
sumber
Sesuai standar ethernet IEEE 802.x, validasi IP adalah rentang IP 0.xxx >>> tidak boleh diizinkan - IP tidak valid. # 1. Rentang IP mulai dari 1.xxx hingga 126.xxx >>>> dapat diizinkan untuk dikonfigurasi. # 2. Rentang IP 127.xxx >>>> tidak boleh dibolehkan - IP tidak valid. # 3. Rentang IP 128.xxx hingga 223.xxx >> dapat diizinkan untuk dikonfigurasi. cara yang lebih baik untuk menanganinya disarankan sebagai berikut: ^ (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]?) $
Yogesh Aggarwal
1

Dengan subnet mask:

^$|([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]))?)$
hsuk
sumber
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})))

Tes untuk menemukan kecocokan dalam teks, https://regex101.com/r/9CcMEN/2

Berikut adalah aturan yang menentukan kombinasi valid di setiap nomor alamat IP:

  • Nomor satu atau dua digit apa saja.
  • Nomor tiga digit apa pun yang dimulai dengan 1.

  • Nomor tiga digit apa pun yang diawali dengan 2digit kedua yang 0 masuk 4.

  • Setiap tiga digit nomor awal dengan 25jika digit ketiga adalah 0 melalui 5.

Mari kita mulai dengan (((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.), satu set empat subekspresi bersarang, dan kita akan melihatnya dalam urutan terbalik. (\d{1,2})cocok dengan satu atau dua digit angka atau angka 0melalui 99. (1\d{2})cocok dengan nomor tiga digit yang diawali dengan 1( 1diikuti oleh dua digit), atau nomor 100sampai 199. (2[0-4]\d)mencocokkan angka 200melalui 249. (25[0-5])mencocokkan angka 250melalui 255. Masing-masing sub-ekspresi ini diapit oleh sub-ekspresi lain dengan di |antara masing-masing (sehingga salah satu dari empat sub-ekspresi harus cocok, tidak semua). Setelah kisaran angka datang \.untuk mencocokkan ., dan kemudian seluruh seri (semua pilihan angka ditambah\.) dimasukkan ke dalam subekspresi lain dan diulang tiga kali menggunakan {3}. Terakhir, kisaran angka diulang (kali ini tanpa tanda akhir \.) untuk mencocokkan nomor alamat IP akhir. Dengan membatasi masing-masing dari empat angka ke nilai antara 0dan 255, pola ini memang dapat mencocokkan alamat IP yang valid dan menolak alamat yang tidak valid.

Kutipan Dari: Ben Forta. “Mempelajari Ekspresi Reguler.”


Jika tidak ada karakter yang diinginkan di awal alamat IP atau di akhir, ^dan karakter $meta masing-masing harus digunakan.

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

Uji untuk menemukan kecocokan dalam teks, https://regex101.com/r/uAP31A/1

snr
sumber
1

Saya mencoba membuatnya sedikit lebih sederhana dan lebih pendek.

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

Jika Anda mencari 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])$

Jika ada yang ingin tahu cara kerjanya berikut ini penjelasannya. Sangat sederhana. Coba saja: 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

Secara matematis itu seperti:

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

Jadi, seperti yang Anda lihat biasanya ini adalah pola untuk alamat IP. Saya harap memahami Ekspresi Reguler sedikit membantu. : hal

Arhan Ashik
sumber
1

Saya mencoba membuatnya sedikit lebih sederhana dan lebih pendek.

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

Jika Anda mencari 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]) $

Jika ada yang ingin tahu cara kerjanya berikut ini penjelasannya. Sangat sederhana. Coba saja: 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

Secara matematis itu seperti:

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

Jadi, seperti yang Anda lihat biasanya ini adalah pola untuk alamat IP. Saya harap memahami Ekspresi Reguler sedikit membantu. : hal

Arhan Ashik
sumber
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";

Saya mengadaptasi ekspresi reguler yang diambil dari pustaka RegexBuddy JGsoft ke bahasa C (regcomp / regexec) dan saya menemukan itu berfungsi tetapi ada sedikit masalah di beberapa OS seperti Linux. Ekspresi reguler tersebut menerima alamat ipv4 seperti 192.168.100.009 di mana 009 di Linux dianggap sebagai nilai oktal sehingga alamat tersebut bukan yang Anda pikirkan. Saya mengubah ekspresi reguler itu sebagai berikut:

    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";

menggunakan ekspresi reguler sekarang 192.168.100.009 bukan alamat ipv4 yang valid, sedangkan 192.168.100.9 tidak apa-apa.

Saya mengubah ekspresi reguler untuk alamat multicast juga dan itu adalah sebagai berikut:

    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";

Saya pikir Anda harus menyesuaikan ekspresi reguler dengan bahasa yang Anda gunakan untuk mengembangkan aplikasi Anda

Saya memberi contoh di 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();
        }
    }
Fabio Stafforte
sumber
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

(Ini adalah DFA yang cocok dengan seluruh ruang addr (termasuk siaran, dll.) Dan tidak ada yang lain.

Jonathzen
sumber
0

Saya pikir yang ini adalah yang terpendek.

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

Saya menemukan sampel ini sangat berguna, selain itu memungkinkan notasi ipv4 yang berbeda.

kode contoh menggunakan 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
internety
sumber
0
((\.|^)(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0$)){4}

Regex ini tidak menerima 08.8.8.8 atau 8.08.8.8 atau 8.8.08.8 atau 8.8.8.08

sudistack
sumber
yang satu ini meleset misalnya 127.0.0.1 dan 0.0.0.0
anneb
^ ((\. | ^) (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
1
Benar untuk menolak nol di depan, menurut spesifikasi.
John Haugeland
0

Menemukan alamat IP yang valid selama IP melingkari karakter apa pun selain digit (di belakang atau di depan IP). 4 Referensi latar dibuat: $ + {pertama}. $ + {Kedua}. $ + {Ketiga}. $ + {Seterusnya}

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.

Mengganti bagian dari setiap oktek dengan nilai sebenarnya namun Anda dapat membangun find Anda sendiri dan mengganti yang sebenarnya berguna untuk mengubah IP dalam file teks:

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]))

Anda masih bisa melakukan Replace menggunakan grup back-referece dengan cara yang sama persis seperti sebelumnya.

Anda bisa mendapatkan gambaran tentang bagaimana hal di atas cocok di bawah ini:

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

Menggunakan grep Anda dapat melihat hasilnya di bawah ini:

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
rda
sumber
0

Alamat IPv4 adalah hal yang sangat rumit.

Catatan : Indentasi dan pelapisan hanya untuk tujuan ilustrasi dan tidak ada di RegEx yang sebenarnya.

\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

Alamat IPv4 ini divalidasi oleh RegEx di atas.

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

Ini ditolak.

256.0.0.1
192.168.1.099 # 099 is not a valid number
4294967296 # UINT32_MAX + 1
0x100000000
020000000000
iBug
sumber
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]?))$


Di atas akan menjadi regex untuk alamat ip seperti: 221.234.000.112 juga untuk 221.234.0.112, 221.24.03.112, 221.234.0.1


Bisa dibayangkan semua jenis alamat seperti di atas

Ram Sharma
sumber
0

Saya akan menggunakan PCRE dan definekata kunci:

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

Demo: https://regex101.com/r/IB7j48/2

Alasannya adalah untuk menghindari pengulangan (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)pola empat kali. Solusi lain seperti solusi di bawah ini bekerja dengan baik, tetapi tidak mencakup setiap kelompok karena akan diminta oleh banyak orang.

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

Satu-satunya cara lain untuk memiliki 4 grup penangkapan adalah dengan mengulangi pola empat kali:

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

Menangkap ipv4 dalam perl sangatlah mudah

$ 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]
nowox
sumber
0

Regexp IPv4 paling tepat, langsung, dan ringkas yang dapat saya bayangkan adalah

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

Tapi bagaimana dengan kinerja / efisiensi ... Maaf saya tidak tahu, siapa yang peduli?

fuweichin
sumber
0

Coba ini:

\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
AAP
sumber
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
Deepak_Mahalingam
sumber
0

Berikut adalah ekspresi regex untuk memvalidasi Alamat 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]?)$
Dilip Paudel
sumber
0

Jalan mudah

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

Demo

BabiBN
sumber