Saya mengalami masalah saat menulis ekspresi reguler yang cocok dengan alamat IPv6 yang valid, termasuk yang dalam bentuk terkompresi (dengan ::
atau nol di depan dihilangkan dari setiap pasangan byte).
Bisakah seseorang menyarankan ekspresi reguler yang akan memenuhi persyaratan?
Saya sedang mempertimbangkan untuk memperluas setiap pasangan byte dan mencocokkan hasilnya dengan ekspresi reguler yang lebih sederhana.
regex
networking
ipv6
Hanya baca
sumber
sumber
Jawaban:
Saya tidak bisa mendapatkan jawaban @Factor Mystic untuk berfungsi dengan ekspresi reguler POSIX, jadi saya menulis jawaban yang berfungsi dengan ekspresi reguler POSIX dan ekspresi reguler PERL.
Ini harus cocok:
Ekspresi Reguler IPv6:
Untuk kemudahan membaca, berikut ini adalah persamaan reguler di atas yang dipisahkan pada titik-titik OR utama menjadi baris-baris terpisah:
Untuk mempermudah pemahaman di atas, kode "semu" berikut mereplikasi yang di atas:
Saya memposting skrip di GitHub yang menguji ekspresi reguler: https://gist.github.com/syzdek/6086792
sumber
127.000.000.001
fe80
tempat yang seharusnya seperti itu[fF][eE]80
danffff
yang seharusnya seperti[fF]{4}
Berikut ini akan memvalidasi alamat IPv4, IPv6 (penuh dan terkompresi), dan IPv6v4 (lengkap dan terkompresi):
sumber
Sepertinya Anda mungkin menggunakan Python. Jika demikian, Anda dapat menggunakan sesuatu seperti ini:
Saya tidak berpikir Anda harus memiliki IPv6 yang dikompilasi ke Python untuk mendapatkannya
inet_pton
, yang juga dapat mengurai alamat IPv4 jika Anda masuksocket.AF_INET
sebagai parameter pertama. Catatan: ini mungkin tidak berfungsi pada sistem non-Unix.sumber
except
klausa. Jika tidak,except
akan menangkap semuanya dan mungkin menutupi kesalahan yang tidak terkait. Tipe di sini seharusnyasocket.error
.Dari " IPv6 regex ":
sumber
Saya harus mendukung jawaban dari Frank Krueger .
Sementara Anda mengatakan Anda memerlukan ekspresi reguler untuk mencocokkan alamat IPv6, saya berasumsi apa yang sebenarnya Anda butuhkan adalah dapat memeriksa apakah string yang diberikan adalah alamat IPv6 yang valid. Ada perbedaan yang halus namun penting di sini.
Ada lebih dari satu cara untuk memeriksa apakah string yang diberikan adalah alamat IPv6 yang valid dan pencocokan ekspresi reguler hanyalah satu solusi.
Gunakan perpustakaan yang ada jika Anda bisa. Perpustakaan akan memiliki lebih sedikit bug dan penggunaannya akan menghasilkan lebih sedikit kode untuk Anda pelihara.
Ekspresi reguler yang disarankan oleh Factor Mystic panjang dan rumit. Kemungkinan besar berhasil, tetapi Anda juga harus mempertimbangkan bagaimana Anda akan mengatasinya jika tiba-tiba gagal. Poin yang ingin saya sampaikan di sini adalah jika Anda tidak dapat membentuk ekspresi reguler yang diperlukan sendiri, Anda tidak akan dapat dengan mudah men-debugnya.
Jika Anda tidak memiliki pustaka yang sesuai, mungkin lebih baik menulis rutin validasi IPv6 Anda sendiri yang tidak bergantung pada ekspresi reguler. Jika Anda menulisnya Anda memahaminya dan jika Anda memahaminya Anda dapat menambahkan komentar untuk menjelaskannya sehingga orang lain juga dapat memahami dan selanjutnya memeliharanya.
Bertindak dengan hati-hati saat menggunakan ekspresi reguler yang fungsinya tidak dapat Anda jelaskan kepada orang lain.
sumber
return ex1.match(S) && ! ex2.match(S)
).Saya bukan ahli Ipv6 tetapi saya pikir Anda bisa mendapatkan hasil yang cukup bagus dengan lebih mudah dengan yang ini:
untuk menjawab "adalah ipv6 yang valid" sepertinya oke bagi saya. Untuk memecahnya menjadi beberapa bagian ... lupakan saja. Saya telah menghilangkan satu yang tidak ditentukan (: :) karena tidak ada gunanya memiliki "alamat yang tidak ditentukan" dalam database saya.
permulaan:
^([0-9A-Fa-f]{0,4}:){2,7}
<- cocokkan bagian yang dapat dikompresi, kita dapat menerjemahkan ini sebagai: antara 2 dan 7 titik dua yang mungkin memiliki angka heaxadecimal di antara keduanya.diikuti oleh:
[0-9A-Fa-f]{1,4}$
<- angka heksadesimal (di depan 0 dihilangkan) ATAU((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}
<- alamat Ipv4sumber
start() = 0, end() = 3 group(0) = "::1" group(1) = ":" group(2) = "1" group(3) = "null" group(4) = "null" group(5) = "null"
Ini menangkap loopback (:: 1) juga dan alamat ipv6. diubah {} menjadi + dan meletakkan: di dalam kurung siku pertama.
diuji dengan ifconfig -a output http://regexr.com/
Unix atau Mac OSx terminal o opsi mengembalikan hanya keluaran yang cocok (ipv6) termasuk: 1
Dapatkan Semua alamat IP (IPv4 ATAU IPv6) dan cetak cocok pada istilah OSx unix
sumber
ip a | grep -Po '[\w:]+:+[\w:]+'
Ekspresi reguler ini akan cocok dengan alamat IPv6 dan IPv4 yang valid sesuai dengan implementasi GNU C ++ dari regex dengan mode REGULAR EXTENDED yang digunakan:
sumber
Awas! Di Java, penggunaan InetAddress dan kelas terkait (Inet4Address, Inet6Address, URL) mungkin melibatkan lalu lintas jaringan! Misalnya penyelesaian DNS (URL.equals, InetAddress dari string!). Panggilan ini mungkin memakan waktu lama dan memblokir!
Untuk IPv6 saya punya sesuatu seperti ini. Ini tentu saja tidak menangani detail yang sangat halus dari IPv6 seperti indeks zona yang hanya diperbolehkan pada beberapa kelas alamat IPv6. Dan regex ini tidak ditulis untuk pengambilan grup, ini hanya jenis regexp yang "cocok".
S
- Segmen IPv6 =[0-9a-f]{1,4}
I
- IPv4 =(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})
Skema (bagian pertama cocok dengan alamat IPv6 dengan akhiran IPv4, bagian kedua cocok dengan alamat IPv6, bagian terakhir indeks zona):
Dan di sini might regex (case insensitive, dikelilingi dengan apa yang pernah dibutuhkan seperti awal / akhir baris, dll.):
sumber
Regex berikut hanya untuk IPv6. Grup 1 cocok dengan IP.
sumber
Regex sederhana yang akan cocok, tetapi saya tidak akan merekomendasikan untuk validasi dalam bentuk apa pun adalah ini:
Perhatikan bahwa ini cocok dengan kompresi di manapun dalam alamat, meskipun tidak akan cocok dengan alamat loopback :: 1. Saya menemukan ini sebagai kompromi yang masuk akal untuk menjaga ekspresi reguler tetap sederhana.
Saya berhasil menggunakan ini dalam aturan pemilihan cerdas iTerm2 ke alamat IPv6 empat kali klik.
sumber
A-F
, tidakA-Z
! Perhatikan juga bahwa Anda tidak termasuk notasi titik-titik.Jika Anda menggunakan Perl coba Net :: IPv6Addr
NetAddr :: IP
Validasi :: IP
sumber
Di Scala, gunakan validator Apache Commons yang terkenal.
http://mvnrepository.com/artifact/commons-validator/commons-validator/1.4.1
Mengikuti tes metode
ip(ip: String)
:sumber
1200:0000:AB00:1234:0000:2552:7777:1313
adalah format yang valid untuk alamat IPv6, tetapi ini bukan alamat IPv6 yang valid saat metode pengujian kembali. Saya berani bertaruh menurutnya itu241.54.113.65
adalah alamat IPv4 yang valid.Melihat pola yang termasuk dalam jawaban lain ada sejumlah pola bagus yang dapat diperbaiki dengan mereferensikan kelompok dan memanfaatkan lookahead. Berikut adalah contoh pola yang merujuk pada diri sendiri yang akan saya gunakan di PHP jika saya harus:
Catatan: PHP memiliki filter bawaan untuk ini yang akan menjadi solusi yang lebih baik daripada pola ini.
Analisis Regex101
sumber
Saya membuat yang berikut ini menggunakan python dan bekerja dengan modul re. Pernyataan di depan memastikan bahwa jumlah titik atau titik dua yang benar muncul di alamat. Itu tidak mendukung IPv4 dalam notasi IPv6.
sumber
Regex untuk ipv6 bisa menjadi sangat rumit ketika Anda mempertimbangkan alamat dengan ipv4 tertanam dan alamat yang dikompresi, seperti yang Anda lihat dari beberapa jawaban ini.
Pustaka Java IPAddress sumber terbuka akan memvalidasi semua representasi standar IPv6 dan IPv4 dan juga mendukung panjang prefiks (dan validasinya). Penafian: Saya adalah manajer proyek perpustakaan itu.
Contoh kode:
sumber
Di Java, Anda dapat menggunakan kelas perpustakaan
sun.net.util.IPAddressUtil
:sumber
Sulit untuk menemukan ekspresi reguler yang berfungsi untuk semua kasus IPv6. Mereka biasanya sulit dirawat, tidak mudah dibaca dan dapat menyebabkan masalah kinerja. Oleh karena itu, saya ingin membagikan solusi alternatif yang telah saya kembangkan: Regular Expression (RegEx) for IPv6 Separate from IPv4
Sekarang Anda mungkin bertanya bahwa "Metode ini hanya menemukan IPv6, bagaimana saya dapat menemukan IPv6 dalam teks atau file?" Berikut adalah metode untuk masalah ini juga.
Catatan : Jika Anda tidak ingin menggunakan kelas IPAddress di .NET, Anda juga dapat menggantinya dengan metode saya . Ini juga mencakup IPv4 yang dipetakan dan kasus khusus juga, sedangkan IPAddress tidak mencakup.
sumber
InetAddressUtils
memiliki semua pola yang ditentukan. Saya akhirnya menggunakan pola mereka secara langsung, dan menempelkannya di sini untuk referensi:sumber
Menggunakan Ruby? Coba ini:
sumber
Bergantung pada kebutuhan Anda, perkiraan seperti:
mungkin cukup (seperti grep file log sederhana, misalnya.)
sumber
Untuk pengguna PHP 5.2+
filter_var
bekerja dengan baik.Saya tahu ini tidak menjawab pertanyaan asli (khususnya solusi regex), tetapi saya memposting ini dengan harapan dapat membantu orang lain di masa depan.
sumber
Ini akan berfungsi untuk IPv4 dan IPv6:
sumber
::
. misalnya2404:6800::4003:c02::8a
Inilah yang saya dapatkan, menggunakan sedikit lookahead dan grup bernama. Ini tentu saja hanya IPv6, tetapi tidak akan mengganggu pola tambahan jika Anda ingin menambahkan IPv4:
sumber
Anda dapat menggunakan alat shell ipextract yang saya buat untuk tujuan ini. Mereka didasarkan pada regexp dan grep.
Pemakaian:
sumber
Hanya mencocokkan yang lokal dari asal dengan menyertakan tanda kurung siku. Saya tahu ini tidak komprehensif tetapi dalam javascript yang lain sulit untuk melacak masalah terutama yang tidak berfungsi, jadi ini sepertinya memberi saya apa yang saya butuhkan untuk saat ini. AF kapital tambahan juga tidak diperlukan.
Versi Jinnko disederhanakan dan lebih baik saya mengerti.
sumber
Seperti yang dinyatakan di atas, cara lain untuk mendapatkan representasi tekstual IPv6 yang memvalidasi parser adalah dengan menggunakan pemrograman. Ini adalah salah satu yang sepenuhnya sesuai dengan RFC-4291 dan RFC-5952. Saya telah menulis kode ini di ANSI C (bekerja dengan GCC, lulus tes di Linux - bekerja dengan clang, lulus tes di FreeBSD). Jadi, ini hanya bergantung pada pustaka standar ANSI C, sehingga dapat dikompilasi di mana saja (saya telah menggunakannya untuk penguraian IPv6 di dalam modul kernel dengan FreeBSD).
sumber
Coba satu baris kecil ini. Ini seharusnya hanya cocok dengan alamat IPv6 tidak terkompresi / terkompresi yang valid (tidak ada hibrida IPv4)
sumber
Regex memungkinkan penggunaan angka nol di depan di bagian IPv4.
Beberapa distro Unix dan Mac mengubah segmen tersebut menjadi oktal.
Saya sarankan menggunakan
25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d
sebagai segmen IPv4.sumber
Jika Anda hanya menginginkan IP normal (tanpa garis miring), di sini:
Saya menggunakannya untuk penyorot sintaks saya di aplikasi editor file host. Bekerja sebagai pesona.
sumber