Geçerli IPv6 adresleriyle eşleşen normal ifade


111

Sıkıştırılmış biçimlerindekiler de dahil olmak üzere geçerli IPv6 adresleriyle eşleşen normal bir ifade yazarken sorun yaşıyorum ( ::her bayt çiftinde sıfırlar çıkarılmış veya baştaki sıfırlar).

Birisi gereksinimi karşılayacak bir düzenli ifade önerebilir mi?

Her bayt çiftini genişletmeyi ve sonucu daha basit bir normal ifadeyle eşleştirmeyi düşünüyorum.



Aşağıdaki tüm cevapları denedim ve tüm test durumlarım için çalışmıyorlar ve / veya istenmeyen IPv4'ü de içeriyorlar. Bunun şimdiye kadarki en temiz çözüm olduğunu buldum: stackoverflow.com/a/21944928/3112803
gfrobenius

Yanıtlar:


252

@Factor Mystic'in yanıtını POSIX normal ifadeleri ile çalışacak şekilde alamadım, bu yüzden POSIX normal ifadeleri ve PERL normal ifadeleri ile çalışan bir tane yazdım.

Eşleşmesi gerekir:

IPv6 Normal İfadesi:

(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

Okuma kolaylığı için, aşağıdaki normal ifade, ana VEYA noktalarında ayrı satırlara bölünmüştür:

# IPv6 RegEx
(
([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|          # 1:2:3:4:5:6:7:8
([0-9a-fA-F]{1,4}:){1,7}:|                         # 1::                              1:2:3:4:5:6:7::
([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|         # 1::8             1:2:3:4:5:6::8  1:2:3:4:5:6::8
([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|  # 1::7:8           1:2:3:4:5::7:8  1:2:3:4:5::8
([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|  # 1::6:7:8         1:2:3:4::6:7:8  1:2:3:4::8
([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|  # 1::5:6:7:8       1:2:3::5:6:7:8  1:2:3::8
([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|  # 1::4:5:6:7:8     1:2::4:5:6:7:8  1:2::8
[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|       # 1::3:4:5:6:7:8   1::3:4:5:6:7:8  1::8  
:((:[0-9a-fA-F]{1,4}){1,7}|:)|                     # ::2:3:4:5:6:7:8  ::2:3:4:5:6:7:8 ::8       ::     
fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|     # fe80::7:8%eth0   fe80::7:8%1     (link-local IPv6 addresses with zone index)
::(ffff(:0{1,4}){0,1}:){0,1}
((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|          # ::255.255.255.255   ::ffff:255.255.255.255  ::ffff:0:255.255.255.255  (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
([0-9a-fA-F]{1,4}:){1,4}:
((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])           # 2001:db8:3:4::192.0.2.33  64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
)

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

Yukarıdakilerin anlaşılmasını kolaylaştırmak için aşağıdaki "sözde" kod yukarıdakileri çoğaltır:

IPV4SEG  = (25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])
IPV4ADDR = (IPV4SEG\.){3,3}IPV4SEG
IPV6SEG  = [0-9a-fA-F]{1,4}
IPV6ADDR = (
           (IPV6SEG:){7,7}IPV6SEG|                # 1:2:3:4:5:6:7:8
           (IPV6SEG:){1,7}:|                      # 1::                                 1:2:3:4:5:6:7::
           (IPV6SEG:){1,6}:IPV6SEG|               # 1::8               1:2:3:4:5:6::8   1:2:3:4:5:6::8
           (IPV6SEG:){1,5}(:IPV6SEG){1,2}|        # 1::7:8             1:2:3:4:5::7:8   1:2:3:4:5::8
           (IPV6SEG:){1,4}(:IPV6SEG){1,3}|        # 1::6:7:8           1:2:3:4::6:7:8   1:2:3:4::8
           (IPV6SEG:){1,3}(:IPV6SEG){1,4}|        # 1::5:6:7:8         1:2:3::5:6:7:8   1:2:3::8
           (IPV6SEG:){1,2}(:IPV6SEG){1,5}|        # 1::4:5:6:7:8       1:2::4:5:6:7:8   1:2::8
           IPV6SEG:((:IPV6SEG){1,6})|             # 1::3:4:5:6:7:8     1::3:4:5:6:7:8   1::8
           :((:IPV6SEG){1,7}|:)|                  # ::2:3:4:5:6:7:8    ::2:3:4:5:6:7:8  ::8       ::       
           fe80:(:IPV6SEG){0,4}%[0-9a-zA-Z]{1,}|  # fe80::7:8%eth0     fe80::7:8%1  (link-local IPv6 addresses with zone index)
           ::(ffff(:0{1,4}){0,1}:){0,1}IPV4ADDR|  # ::255.255.255.255  ::ffff:255.255.255.255  ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
           (IPV6SEG:){1,4}:IPV4ADDR               # 2001:db8:3:4::192.0.2.33  64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
           )

GitHub'da normal ifadeyi test eden bir komut dosyası yayınladım: https://gist.github.com/syzdek/6086792


3
IPv4 normal 127.000.000.001
ifadeniz

21
IPv4 segmentleri baştaki sıfırları içermemelidir. Baştaki sıfır varsa, IPv4 segmenti sekizlik olarak yorumlanmalıdır. Dolayısıyla, yukarıdaki IPV4SEG '000'a izin vermemekte doğrudur. Bununla birlikte, olmaması gereken '00'a izin verir.
par

3
Beklediğim gibi tarayıcıda benim için çalışmadı. Doğrulanmış çift reg.test ('3zzzzffe: 1900: 4545: 3: 200: f8ff: fe21: 67cf'), bu açıkça geçerli bir IPv6 adresi değildir. Burada regex ile çok daha iyi sonuçlar elde edildi: nbviewer.ipython.org/github/rasbt/python_reference/blob/master/…
Capaj

7
harika ipv6 regex. yerel bağlantı bölümünde küçük bir hata buldu. fe80olması gereken yerde vardı [fF][eE]80ve ffff[fF]{4}
şuna

4
Özen gösterirseniz ve biçimlendirirseniz normal ifadelerin (herhangi bir kaynak kodla aynı şekilde) gerçekten okunabilir olduğunu gösteren +1.
Natix

52

Aşağıdakiler IPv4, IPv6 (tam ve sıkıştırılmış) ve IPv6v4 (tam ve sıkıştırılmış) adreslerini doğrular:

'/^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$/iD'

8
Frank Krueger'in önerdiği gibi ip-s doğrulaması yapılabilse de, bu çözüm aslında soruyu yanıtlayan çözümdür (henüz tam olarak test etmedim) ve sözdizimsel olarak test etmek istediğiniz birçok IP-s'niz varsa ve belki bir metin satırında eşleşiyorsa, IP doğrulama tekniğini kullanamazsınız.
Gyuri

Merhaba, bu RegExp'i test ettim ve benim için çalışmadım. D'nin geçersiz bir bayrak olduğunu söylüyor ve onu kaldırdığımda "SyntaxError: geçersiz nicelik belirteci" diyor
diosney

3
JavaScript, PCRE'nin tamamını değil, Perl tarzı normal ifadelerin bir alt kümesini uygular. Normal ifadem, PCRE'nin bazı gelişmiş özellikleri olmadan çalışmaz.
MichaelRushton

2
Bu benim için C #
sarat

1
Başarısız test durumu: FE80: 0000: 0000: 0000: 0202: B3FF: FE1E: 8329 Bu tarihte Elixir'in altında PCRE kullanan en son sürümü kullanılıyor.
pmarreck

23

Python kullanıyormuşsunuz gibi görünüyor. Öyleyse, bunun gibi bir şey kullanabilirsiniz:

import socket

def check_ipv6(n):
    try:
        socket.inet_pton(socket.AF_INET6, n)
        return True
    except socket.error:
        return False

print check_ipv6('::1') # True
print check_ipv6('foo') # False
print check_ipv6(5)     # TypeError exception
print check_ipv6(None)  # TypeError exception

IPv6'nın Python'da derlenmiş olması gerektiğini düşünmüyorum inet_pton, bu da socket.AF_INETilk parametre olarak girerseniz IPv4 adreslerini ayrıştırabilir . Not: Bu, Unix olmayan sistemlerde çalışmayabilir.


4
İfadede istisna türünü belirtmelisiniz except. Aksi takdirde, excepther şeyi yakalar ve ilgisiz hataları maskeleyebilir. Buradaki tip olmalı socket.error.
Ayman Hourieh

A) inet_pton, dokümanlar yanlış olmadığı sürece başka istisnalar atmaz ve B) yapsa bile, False dışında başka ne döndürürdünüz?
Joe Hildebrand

2
Re: diğer hatalar ... kullanıcı bir dizge olmayan bir şekilde geçerse, TypeError yenilir. Açıkçası bir liste bir ipv6 değil, ancak muhtemelen yanlış tipte geçtiğim sazan olmasını isterdim.
Gregg Lind

1
+1 Bu bana çok yardımcı oldu. Eklenmesi gereken birkaç ek nokta: 1) socket.inet_pton her iki IP adresi ailesinin (IP ve IPv6) geçerliliğini test etmek için kullanılabilir. 2) Buradaki dokümanlar ( docs.python.org/2/library/socket.html ), bunun Unix platformlarında mevcut olduğunu göstermektedir. Win platformlarında mevcut olmayabilir.
mkoistinen

django kullanmak ve bu yardımcı olur!
elad silver

23

" IPv6 normal ifadesinden ":

(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,6}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}\Z)|
(\A([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}\Z)|
(\A([0-9a-f]{1,4}:){1,6}(:[0-9a-f]{1,4}){1,1}\Z)|
(\A(([0-9a-f]{1,4}:){1,7}|:):\Z)|
(\A:(:[0-9a-f]{1,4}){1,7}\Z)|
(\A((([0-9a-f]{1,4}:){6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A(([0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A([0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,3}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,2}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,1}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A(([0-9a-f]{1,4}:){1,5}|:):(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A:(:[0-9a-f]{1,4}){1,5}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)

45
Bunun gibi düzenli ifadeler, belki de düzenli ifadenin burada en uygun çözüm olmadığı bir "kod kokusu" olmalıdır. (Her ne kadar operasyon bunu istedi sanırım ...)
Thanatos

10
@ user712092 - bunun gibi göze hoş gelen bir kod tabanı gören herkes
danielpops

2
Bu RE'ler için tamamen gereksiz bir hilekârlıktır. Onu oluşturan program ne yaptığını anlamadı. Bir insan bunu asla bu şekilde yapmaz. Görünen karmaşıklığa aldanmayın - RE'ler aslında birçok insan için "kara büyüdür", ancak onları başka bir gezegene yerleştirmek için hiçbir neden yok!
Chuck Kollars

+1 ama OMG bunu yapmanın daha iyi bir yolu olmalı: P Referans için: Rails için bu yardımcı olabilir: stackoverflow.com/questions/16965697/…
Tilo

1
Aslında bir kod kokusu; ancak bir göz attıktan sonra her normal ifadenin oldukça kısa olduğunu göreceksiniz. Sorun şu ki, ipv6'nın 'sıkıştırılması' ile oluşturulan farklı desenler vardır - Baştaki, ortadaki ve sondaki iki nokta üst üste çift kolonunuzu kullandıysanız, bunu tekrar kullanamazsınız, toplamın üstüne çiftin öncesi ve sonrası iki nokta üst üste toplamı gerekir. Perl 6 bunun üstesinden gelebilir , ancak PCRE sözdiziminin çok ötesinde. (Not - ipv6 bölümünden daha uzun olan gömülü ipv4'ü sonunda saymıyorum!)
Gerard 1

11

Frank Krueger'in cevabını şiddetle ikinci olarak almalıyım .

Bir IPv6 adresiyle eşleşmek için normal bir ifadeye ihtiyacınız olduğunu söylerken, gerçekten ihtiyacınız olan şeyin belirli bir dizenin geçerli bir IPv6 adresi olup olmadığını kontrol edebilmek olduğunu varsayıyorum. Burada ince ama önemli bir ayrım var.

Belirli bir dizenin geçerli bir IPv6 adresi olup olmadığını kontrol etmenin birden fazla yolu vardır ve düzenli ifade eşleştirmesi yalnızca bir çözümdür.

Mümkünse mevcut bir kitaplığı kullanın. Kütüphane daha az hataya sahip olacak ve kullanımı, sizin bakımınız için daha az kod sağlayacaktır.

Factor Mystic tarafından önerilen düzenli ifade uzun ve karmaşıktır. Büyük olasılıkla işe yarıyor, ancak beklenmedik bir şekilde başarısız olursa nasıl başa çıkacağınızı da düşünmelisiniz. Burada belirtmeye çalıştığım nokta, gerekli bir düzenli ifadeyi kendiniz oluşturamazsanız, kolayca hata ayıklayamayacağınızdır.

Uygun bir kitaplığınız yoksa, normal ifadelere bağlı olmayan kendi IPv6 doğrulama yordamınızı yazmanız daha iyi olabilir. Eğer yazarsanız anlarsınız ve anlarsanız, başkalarının da anlayabilmesi ve daha sonra sürdürebilmesi için açıklamak için yorumlar ekleyebilirsiniz.

İşlevselliğini başka birine açıklayamayacağınız bir normal ifade kullanırken dikkatli davranın.


1
İlkinin izin verdiği geçersiz adresleri yakalamak için iki normal ifade, bir liberal ifade ve bir istisna ifadesi kullanmak, bir ifadeden ( return ex1.match(S) && ! ex2.match(S)) daha kolay olabilir .
Raedwald

4
Büyük bir metin bloğunda IP'leri neredeyse kesinlikle aradığında, bireysel IP'leri doğruladığını varsayıyorsunuz.
Navin

8

Ben bir Ipv6 uzmanı değilim ama bununla çok daha iyi bir sonuç alabileceğinizi düşünüyorum:

^([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})$

"geçerli bir ipv6" yanıtını bana ok gibi görünüyor. Parçalara ayırmak için ... unutun. Veritabanımda "belirsiz adres" olması gerekmediği için belirtilmemiş olanı (: :) atladım.

başlangıç: ^([0-9A-Fa-f]{0,4}:){2,7}<- sıkıştırılabilir kısmı eşleştirin, bunu şu şekilde çevirebiliriz: aralarında heaxadecimal sayı olabilecek 2 ve 7 kolon arasında.

ardından: [0-9A-Fa-f]{1,4}$<- onaltılık bir sayı ( ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}baştaki 0 atlanmıştır) VEYA <- bir Ipv4 adresi


1
Gerçekten OPs sorusuna sadık kalmak ve biraz işe yarayan nispeten yakışıklı bir normal ifade sunmak için +1.
xebeche

1
Bu ":: 1" ile eşleşmiyor
eşleşmiyor

Ha? Java regex söz diziminde şunlarla eşleşir:start() = 0, end() = 3 group(0) = "::1" group(1) = ":" group(2) = "1" group(3) = "null" group(4) = "null" group(5) = "null"
Remi Morin

Başka bir yerde birisi beni normal ifademle ilgili bir sorun konusunda bilgilendirirse, sıkıştırılmış kısım "::" yalnızca bir kez görünebilir. Yani ":: 1 :: 2" normal ifademle eşleşir, ancak geçerli bir IPV6 değil. İkinci bir normal ifade bu durumu doğrulayabilir. Tam öneri, doğrulamak için durum bilgisi olan bir ayrıştırıcı kullanmaktı. Ortaya çıkan kodun okunması ve sürdürülmesinin daha kolay olacağını kabul ediyorum (ve muhtemelen birisi bunu bir yerde açık kaynak kodludur).
Remi Morin

8

Bu, geridöngü (:: 1) ve ipv6 adreslerini yakalar. {} + olarak değiştirildi ve ilk köşeli parantezin içine koydu.

([a-f0-9:]+:+)+[a-f0-9]+

ifconfig -a çıktı http://regexr.com/ ile test edildi

Unix veya Mac OSx terminal o seçeneği, yalnızca aşağıdakiler dahil eşleşen çıktıyı (ipv6) döndürür: 1

ifconfig -a | egrep -o '([a-f0-9:]+:+)+[a-f0-9]+'

Tüm IP adreslerini (IPv4 VEYA IPv6) alın ve eşleşmeyi unix OSx terimiyle yazdırın

ifconfig -a | egrep -o '([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) | (([a-f0-9:]+:+)+[a-f0-9]+)'

Basitliği seviyorum. Bu sonunda benim için çalıştı:ip a | grep -Po '[\w:]+:+[\w:]+'
Noam Manos

Mizah takdir edildi!
Soumya Kanti

İpconfig / all çalıştırdığımda, ip adresim% 10 ile bitiyor, bu ifade bu bölümle uyuşmuyor?
Peter

7

Bu normal ifade, geçerli IPv6 ve IPv4 adreslerini GNU C ++ regex uygulamasına uygun olarak, REGULAR EXTENDED modu ile eşleştirir:

"^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:)))(%.+)?\s*$"

5

Dikkat! Java'da InetAddress ve ilgili sınıfların (Inet4Address, Inet6Address, URL) kullanımı ağ trafiğini içerebilir!Örneğin, DNS çözümleme (URL.equals, dizeden InetAddress!). Bu arama uzun sürebilir ve engelleniyor!

IPv6 için böyle bir şeye sahibim. Bu elbette IPv6'nın çok ince ayrıntılarını işlemez, çünkü bölge endekslerine yalnızca bazı IPv6 adres sınıflarında izin verilir. Ve bu normal ifade, grup yakalama için yazılmamıştır, yalnızca "eşleşir" türden bir normal ifadedir.

S - IPv6 segmenti = [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})

Şematik (ilk bölüm IPv4 sonekiyle IPv6 adresleriyle eşleşir, ikinci bölüm IPv6 adresleriyle eşleşir, son olarak bölge dizini patrt):

(
(
::(S:){0,5}|
S::(S:){0,4}|
(S:){2}:(S:){0,3}|
(S:){3}:(S:){0,2}|
(S:){4}:(S:)?|
(S:){5}:|
(S:){6}
)
I

|

:(:|(:S){1,7})|
S:(:|(:S){1,6})|
(S:){2}(:|(:S){1,5})|
(S:){3}(:|(:S){1,4})|
(S:){4}(:|(:S){1,3})|
(S:){5}(:|(:S){1,2})|
(S:){6}(:|(:S))|
(S:){7}:|
(S:){7}S
)

(?:%[0-9a-z]+)?

Ve burada güçlü normal ifade (büyük / küçük harfe duyarlı değil, satırın başı / sonu gibi ihtiyaç duyulan şeylerle çevreleyin, vb.):

(?:
(?:
::(?:[0-9a-f]{1,4}:){0,5}|
[0-9a-f]{1,4}::(?:[0-9a-f]{1,4}:){0,4}|
(?:[0-9a-f]{1,4}:){2}:(?:[0-9a-f]{1,4}:){0,3}|
(?:[0-9a-f]{1,4}:){3}:(?:[0-9a-f]{1,4}:){0,2}|
(?:[0-9a-f]{1,4}:){4}:(?:[0-9a-f]{1,4}:)?|
(?:[0-9a-f]{1,4}:){5}:|
(?:[0-9a-f]{1,4}:){6}
)
(?:(?: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})|

:(?::|(?::[0-9a-f]{1,4}){1,7})|
[0-9a-f]{1,4}:(?::|(?::[0-9a-f]{1,4}){1,6})|
(?:[0-9a-f]{1,4}:){2}(?::|(?::[0-9a-f]{1,4}){1,5})|
(?:[0-9a-f]{1,4}:){3}(?::|(?::[0-9a-f]{1,4}){1,4})|
(?:[0-9a-f]{1,4}:){4}(?::|(?::[0-9a-f]{1,4}){1,3})|
(?:[0-9a-f]{1,4}:){5}(?::|(?::[0-9a-f]{1,4}){1,2})|
(?:[0-9a-f]{1,4}:){6}(?::|(?::[0-9a-f]{1,4}))|
(?:[0-9a-f]{1,4}:){7}:|
(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4}
)

(?:%[0-9a-z]+)?

4

Aşağıdaki normal ifade yalnızca IPv6 içindir. Grup 1 IP ile eşleşir.

(([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4})

+1 Bir insanın anlayamayacağı mükemmel bir süper karmaşık normal ifadeye sahip olmak her zaman gerekli değildir. Bunu kullanacağım çünkü ne yaptığını anlıyorum ve benim durumumda, geçerli bir ipv6'ya benzeyen bir şey aldığım için geçerli bir ipv6 olduğundan emin olabilirim.
David L.

3
bu eşleşmez demek: fe80 :: 1 veya 2342: 32fd :: 2d32
James

3

Eşleşecek basit bir normal ifade, ancak herhangi bir tür doğrulama için tavsiye etmem:

([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}

Bunun adresin herhangi bir yerindeki sıkıştırmayla eşleştiğini, geridöngü adresi :: 1 ile eşleşmeyeceğini unutmayın. Normal ifadeyi basit tutmak için bunu makul bir uzlaşma buluyorum.

Bunu iTerm2 akıllı seçim kurallarında IPv6 adreslerine dörtlü tıklama için başarıyla kullanıyorum .


3
Sen demek A-Fdeğil A-Z! Ayrıca noktalı dörtlü gösterimi hariç tuttuğunuzu unutmayın.
xebeche


2

In Scala iyi bilinen Apache Commons doğrulayıcılarını kullanın.

http://mvnrepository.com/artifact/commons-validator/commons-validator/1.4.1

libraryDependencies += "commons-validator" % "commons-validator" % "1.4.1"


import org.apache.commons.validator.routines._

/**
 * Validates if the passed ip is a valid IPv4 or IPv6 address.
 *
 * @param ip The IP address to validate.
 * @return True if the passed IP address is valid, false otherwise.
 */  
 def ip(ip: String) = InetAddressValidator.getInstance().isValid(ip)

Yöntemin testini takiben ip(ip: String):

"The `ip` validator" should {
  "return false if the IPv4 is invalid" in {
    ip("123") must beFalse
    ip("255.255.255.256") must beFalse
    ip("127.1") must beFalse
    ip("30.168.1.255.1") must beFalse
    ip("-1.2.3.4") must beFalse
  }

  "return true if the IPv4 is valid" in {
    ip("255.255.255.255") must beTrue
    ip("127.0.0.1") must beTrue
    ip("0.0.0.0") must beTrue
  }

  //IPv6
  //@see: http://www.ronnutter.com/ipv6-cheatsheet-on-identifying-valid-ipv6-addresses/
  "return false if the IPv6 is invalid" in {
    ip("1200::AB00:1234::2552:7777:1313") must beFalse
  }

  "return true if the IPv6 is valid" in {
    ip("1200:0000:AB00:1234:0000:2552:7777:1313") must beTrue
    ip("21DA:D3:0:2F3B:2AA:FF:FE28:9C5A") must beTrue
  }
}

İlginçtir, geçerli bir adres olduğunu kontrol ettiğini iddia eder, " Aktarılan ipin geçerli bir IPv4 veya IPv6 adresi olup olmadığını doğrular. ", Ancak gerçekten yalnızca geçerli bir adres olarak biçimlendirilip biçimlendirilmediğini kontrol eder. Örneğin, 1200:0000:AB00:1234:0000:2552:7777:1313bir IPv6 adresi için geçerli bir biçimdir, ancak test yöntemi döndüğünde geçerli bir IPv6 adresi değildir. Bahse girerim 241.54.113.65geçerli bir IPv4 adresi olduğunu düşünüyor .
Ron Maupin

2

Diğer cevaplarda yer alan modellere bakıldığında, gruplara atıfta bulunarak ve ileri görüşleri kullanarak geliştirilebilecek bir dizi iyi kalıp vardır. PHP'de gerekirse kullanacağım kendine referans veren bir kalıp örneği:

^(?<hgroup>(?<hex>[[:xdigit:]]{0,4}) # grab a sequence of up to 4 hex digits
                                     # and name this pattern for usage later
     (?<!:::):{1,2})                 # match 1 or 2 ':' characters
                                     # as long as we can't match 3
 (?&hgroup){1,6} # match our hex group 1 to 6 more times
 (?:(?:
    # match an ipv4 address or
    (?<dgroup>2[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(?&dgroup)
    # match our hex group one last time
    |(?&hex))$

Not: PHP'nin bunun için bu kalıptan daha iyi bir çözüm olabilecek yerleşik bir filtresi vardır.

Regex101 Analizi


2

Aşağıdakileri python kullanarak oluşturdum ve re modülü ile çalışıyorum. İleriye dönük iddialar, adreste doğru sayıda nokta veya iki nokta üst üste görünmesini sağlar. IPv6 gösteriminde IPv4'ü desteklemez.

pattern = '^(?=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$)(?:(?:25[0-5]|[12][0-4][0-9]|1[5-9][0-9]|[1-9]?[0-9])\.?){4}$|(?=^(?:[0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}$)(?![^:]*::.+::[^:]*$)(?:(?=.*::.*)|(?=\w+:\w+:\w+:\w+:\w+:\w+:\w+:\w+))(?:(?:^|:)(?:[0-9a-f]{4}|[1-9a-f][0-9a-f]{0,3})){0,8}(?:::(?:[0-9a-f]{1,4}(?:$|:)){0,6})?$'
result = re.match(pattern, ip)
if result: result.group(0)

2

Bu yanıtların bazılarından da görebileceğiniz gibi, yerleşik ipv4 ve sıkıştırılmış adreslere sahip adresleri düşündüğünüzde ipv6 için normal ifadeler gerçekten zor olabilir.

Açık kaynak IPAddress Java kitaplığı , IPv6 ve IPv4'ün tüm standart temsillerini doğrular ve ayrıca önek uzunluğunu (ve bunun doğrulanmasını) destekler. Sorumluluk reddi: Ben o kütüphanenin proje yöneticisiyim.

Kod örneği:

        try {
            IPAddressString str = new IPAddressString("::1");
            IPAddress addr = str.toAddress();
            if(addr.isIPv6() || addr.isIPv6Convertible()) {
                IPv6Address ipv6Addr = addr.toIPv6();
            }
            //use address
        } catch(AddressStringException e) {
            //e.getMessage has validation error
        }

1

Java'da kitaplık sınıfını kullanabilirsiniz sun.net.util.IPAddressUtil:

IPAddressUtil.isIPv6LiteralAddress(iPaddress);

3
sun.net. * özel API'dir.
David Kocher

1

Tüm IPv6 durumları için çalışan bir düzenli ifade bulmak zordur. Genellikle bakımı zordur, kolayca okunamazlar ve performans sorunlarına neden olabilirler. Bu nedenle, geliştirdiğim alternatif bir çözümü paylaşmak istiyorum: IPv6 için Normal İfade (RegEx) IPv4'ten ayrı

Şimdi şunu sorabilirsiniz: "Bu yöntem yalnızca IPv6'yı bulur, IPv6'yı bir metin veya dosyada nasıl bulabilirim?" İşte bu sorun için de yöntemler.

Not : .NET'te IPAddress sınıfını kullanmak istemiyorsanız, benim yöntemimle de değiştirebilirsiniz . Aynı zamanda eşlenmiş IPv4 ve özel durumları da kapsarken, IPAdresi kapsamaz.

class IPv6
{
    public List<string> FindIPv6InFile(string filePath)
    {
        Char ch;
        StringBuilder sbIPv6 = new StringBuilder();
        List<string> listIPv6 = new List<string>();
        StreamReader reader = new StreamReader(filePath);
        do
        {
            bool hasColon = false;
            int length = 0;

            do
            {
                ch = (char)reader.Read();

                if (IsEscapeChar(ch))
                    break;

                //Check the first 5 chars, if it has colon, then continue appending to stringbuilder
                if (!hasColon && length < 5)
                {
                    if (ch == ':')
                    {
                        hasColon = true;
                    }
                    sbIPv6.Append(ch.ToString());
                }
                else if (hasColon) //if no colon in first 5 chars, then dont append to stringbuilder
                {
                    sbIPv6.Append(ch.ToString());
                }

                length++;

            } while (!reader.EndOfStream);

            if (hasColon && !listIPv6.Contains(sbIPv6.ToString()) && IsIPv6(sbIPv6.ToString()))
            {
                listIPv6.Add(sbIPv6.ToString());
            }

            sbIPv6.Clear();

        } while (!reader.EndOfStream);
        reader.Close();
        reader.Dispose();

        return listIPv6;
    }

    public List<string> FindIPv6InText(string text)
    {
        StringBuilder sbIPv6 = new StringBuilder();
        List<string> listIPv6 = new List<string>();

        for (int i = 0; i < text.Length; i++)
        {
            bool hasColon = false;
            int length = 0;

            do
            {
                if (IsEscapeChar(text[length + i]))
                    break;

                //Check the first 5 chars, if it has colon, then continue appending to stringbuilder
                if (!hasColon && length < 5)
                {
                    if (text[length + i] == ':')
                    {
                        hasColon = true;
                    }
                    sbIPv6.Append(text[length + i].ToString());
                }
                else if (hasColon) //if no colon in first 5 chars, then dont append to stringbuilder
                {
                    sbIPv6.Append(text[length + i].ToString());
                }

                length++;

            } while (i + length != text.Length);

            if (hasColon && !listIPv6.Contains(sbIPv6.ToString()) && IsIPv6(sbIPv6.ToString()))
            {
                listIPv6.Add(sbIPv6.ToString());
            }

            i += length;
            sbIPv6.Clear();
        }

        return listIPv6;
    }

    bool IsEscapeChar(char ch)
    {
        if (ch != ' ' && ch != '\r' && ch != '\n' && ch!='\t')
        {
            return false;
        }

        return true;
    }

    bool IsIPv6(string maybeIPv6)
    {
        IPAddress ip;
        if (IPAddress.TryParse(maybeIPv6, out ip))
        {
            return ip.AddressFamily == AddressFamily.InterNetworkV6;
        }
        else
        {
            return false;
        }
    }

}

1

InetAddressUtilstanımlanmış tüm kalıplara sahiptir. Kalıplarını doğrudan kullandım ve referans için buraya yapıştırıyorum:

private static final String IPV4_BASIC_PATTERN_STRING =
        "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" + // initial 3 fields, 0-255 followed by .
         "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"; // final field, 0-255

private static final Pattern IPV4_PATTERN =
    Pattern.compile("^" + IPV4_BASIC_PATTERN_STRING + "$");

private static final Pattern IPV4_MAPPED_IPV6_PATTERN = // TODO does not allow for redundant leading zeros
        Pattern.compile("^::[fF]{4}:" + IPV4_BASIC_PATTERN_STRING + "$");

private static final Pattern IPV6_STD_PATTERN =
    Pattern.compile(
            "^[0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7}$");

private static final Pattern IPV6_HEX_COMPRESSED_PATTERN =
    Pattern.compile(
            "^(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)" + // 0-6 hex fields
             "::" +
             "(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)$"); // 0-6 hex fields 

1

Ruby mi kullanıyorsunuz? Bunu dene:

/^(((?=.*(::))(?!.*\3.+\3))\3?|[\dA-F]{1,4}:)([\dA-F]{1,4}(\3|:\b)|\2){5}(([\dA-F]{1,4}(\3|:\b|$)|\2){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})\z/i

1

İhtiyaçlarınıza bağlı olarak aşağıdaki gibi bir yaklaşım:

[0-9a-f:]+

yeterli olabilir (örneğin, basit günlük dosyası greping'inde olduğu gibi).


0

PHP 5.2+ kullanıcıları için filter_varharika çalışıyor.

Bunun orijinal soruyu yanıtlamadığını biliyorum (özellikle bir normal ifade çözümü), ancak bunu gelecekte başka birine yardımcı olabileceği umuduyla gönderiyorum.

$is_ip4address = (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== FALSE);
$is_ip6address = (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== FALSE);

0

Bu, IPv4 ve IPv6 için çalışacaktır:

^(([0-9a-f]{0,4}:){1,7}[0-9a-f]{1,4}|([0-9]{1,3}\.){3}[0-9]{1,3})$

2
Geçersiz adresleri 2 örneğiyle eşleştirir ::. örneğin2404:6800::4003:c02::8a
nhahtdh

maçlar IPv4 666.666.666.666 geçersiz
Ryan Williams

0

İşte biraz ileriye dönük ve adlandırılmış gruplar kullanarak bulduğum şey. Bu elbette sadece IPv6'dır, ancak IPv4 eklemek istiyorsanız ek kalıplara müdahale etmemelidir:

(?=([0-9a-f]+(:[0-9a-f])*)?(?P<wild>::)(?!([0-9a-f]+:)*:))(::)?([0-9a-f]{1,4}:{1,2}){0,6}(?(wild)[0-9a-f]{0,4}|[0-9a-f]{1,4}:[0-9a-f]{1,4})


0

Köşeli parantezlerin dahil olduğu bir kaynaktan yerel olanlarla eşleştirme. Kapsamlı olmadığını biliyorum, ancak javascript'te diğerlerinin sorunlarının izini sürmekte zorlanıyordu, öncelikle çalışmama sorunu vardı, bu yüzden şimdilik ihtiyacım olanı elde ettim. Ekstra büyük harf AF'ye de gerek yoktur.

^\[([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})\]

Jinnko'nun versiyonu basitleştirilmiş ve daha iyi görüyorum.


0

Yukarıda belirtildiği gibi, ayrıştırıcıyı doğrulayan bir IPv6 metinsel temsil elde etmenin başka bir yolu, programlamayı kullanmaktır. İşte RFC-4291 ve RFC-5952 ile tamamen uyumlu olanı. Bu kodu ANSI C'de yazdım (GCC ile çalışır, Linux'ta testleri geçmiştir - clang ile çalışır, FreeBSD'de testleri geçmiştir). Bu nedenle, yalnızca ANSI C standart kitaplığına dayanır, bu nedenle her yerde derlenebilir (FreeBSD ile bir çekirdek modülünde IPv6 ayrıştırması için kullandım).

// IPv6 textual representation validating parser fully compliant with RFC-4291 and RFC-5952
// BSD-licensed / Copyright 2015-2017 Alexandre Fenyo

#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

typedef enum { false, true } bool;

static const char hexdigits[] = "0123456789abcdef";
static int digit2int(const char digit) {
  return strchr(hexdigits, digit) - hexdigits;
}

// This IPv6 address parser handles any valid textual representation according to RFC-4291 and RFC-5952.
// Other representations will return -1.
//
// note that str input parameter has been modified when the function call returns
//
// parse_ipv6(char *str, struct in6_addr *retaddr)
// parse textual representation of IPv6 addresses
// str:     input arg
// retaddr: output arg
int parse_ipv6(char *str, struct in6_addr *retaddr) {
  bool compressed_field_found = false;
  unsigned char *_retaddr = (unsigned char *) retaddr;
  char *_str = str;
  char *delim;

  bzero((void *) retaddr, sizeof(struct in6_addr));
  if (!strlen(str) || strchr(str, ':') == NULL || (str[0] == ':' && str[1] != ':') ||
      (strlen(str) >= 2 && str[strlen(str) - 1] == ':' && str[strlen(str) - 2] != ':')) return -1;

  // convert transitional to standard textual representation
  if (strchr(str, '.')) {
    int ipv4bytes[4];
    char *curp = strrchr(str, ':');
    if (curp == NULL) return -1;
    char *_curp = ++curp;
    int i;
    for (i = 0; i < 4; i++) {
      char *nextsep = strchr(_curp, '.');
      if (_curp[0] == '0' || (i < 3 && nextsep == NULL) || (i == 3 && nextsep != NULL)) return -1;
      if (nextsep != NULL) *nextsep = 0;
      int j;
      for (j = 0; j < strlen(_curp); j++) if (_curp[j] < '0' || _curp[j] > '9') return -1;
      if (strlen(_curp) > 3) return -1;
      const long val = strtol(_curp, NULL, 10);
      if (val < 0 || val > 255) return -1;
      ipv4bytes[i] = val;
      _curp = nextsep + 1;
    }
    sprintf(curp, "%x%02x:%x%02x", ipv4bytes[0], ipv4bytes[1], ipv4bytes[2], ipv4bytes[3]);
  }

  // parse standard textual representation
  do {
    if ((delim = strchr(_str, ':')) == _str || (delim == NULL && !strlen(_str))) {
      if (delim == str) _str++;
      else if (delim == NULL) return 0;
      else {
        if (compressed_field_found == true) return -1;
        if (delim == str + strlen(str) - 1 && _retaddr != (unsigned char *) (retaddr + 1)) return 0;
        compressed_field_found = true;
        _str++;
        int cnt = 0;
        char *__str;
        for (__str = _str; *__str; ) if (*(__str++) == ':') cnt++;
        unsigned char *__retaddr = - 2 * ++cnt + (unsigned char *) (retaddr + 1);
        if (__retaddr <= _retaddr) return -1;
        _retaddr = __retaddr;
      }
    } else {
      char hexnum[4] = "0000";
      if (delim == NULL) delim = str + strlen(str);
      if (delim - _str > 4) return -1;
      int i;
      for (i = 0; i < delim - _str; i++)
        if (!isxdigit(_str[i])) return -1;
        else hexnum[4 - (delim - _str) + i] = tolower(_str[i]);
      _str = delim + 1;
      *(_retaddr++) = (digit2int(hexnum[0]) << 4) + digit2int(hexnum[1]);
      *(_retaddr++) = (digit2int(hexnum[2]) << 4) + digit2int(hexnum[3]);
    }
  } while (_str < str + strlen(str));
  return 0;
}

-1

Bu küçük tek astarı deneyin. Yalnızca geçerli sıkıştırılmamış / sıkıştırılmış IPv6 adresleriyle eşleşmelidir (IPv4 hibritleri yok)

/(?!.*::.*::)(?!.*:::.*)(?!:[a-f0-9])((([a-f0-9]{1,4})?[:](?!:)){7}|(?=(.*:[:a-f0-9]{1,4}::|^([:a-f0-9]{1,4})?::))(([a-f0-9]{1,4})?[:]{1,2}){1,6})[a-f0-9]{1,4}/

Aslında, geçerli IPv6 adresleri sıkıştırılmamış, sıkıştırılmış, sıkıştırılmamış hibrit ve sıkıştırılmış karma içerir. Bir IPv6 adresinin herhangi bir geçerli metin temsiliyle eşleştirmeniz gerekenden çok daha fazlasını gerektirir.
Ron Maupin

-2

Normal ifade, IPv4 bölümlerinde baştaki sıfırların kullanılmasına izin verir.

Bazı Unix ve Mac dağıtımları bu segmentleri oktallara dönüştürür.

25[0-5]|2[0-4]\d|1\d\d|[1-9]?\dIPv4 segmenti olarak kullanmanızı öneririm .


-2

Yalnızca normal IP'ler istiyorsanız (eğik çizgi yok), burada:

^(?:[0-9a-f]{1,4}(?:::)?){0,7}::[0-9a-f]+$

Bunu, ana bilgisayar dosyası düzenleyici uygulamasında söz dizimi vurgulayıcım için kullanıyorum. Cazibe olarak çalışıyor.


Bunun düzgün bir şekilde çalışmasına imkan yok, tek bir ipv6 adresini içinde tek bir iki nokta üst üste ile eşleştiremez, tüm eşleşmeleriniz çift iki nokta üstüste bulunur ve son grubunuz için açıkça bir çift iki nokta üst üste gerekir, özetleme her yerde olabilir .. .
KillianDS

(?: [0-9a-f] {1,4} (? :::?)?) {0,7} ::? [0-9a-f] {1,4}
Harry

Yine de yanlış, ama o zaman bile JinnKo'nun yanıtını tekrar edeceksiniz, bu basit amaçlar için yeterince iyi, ancak yine de kusurları var (çift özetleme yapmaz ve noktalı dörtlülere, localhost'a veya :: sonlandırmaya izin vermez. ..)
KillianDS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.