Yanıtlar:
Aşağıdaki normal ifadeleri ayrı ayrı veya bir ortak OR ifadesinde birleştirerek kullanabilirsiniz.
ValidIpAddressRegex = "^(([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])$";
ValidHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$";
ValidIpAddressRegex geçerli IP adresleri ve ValidHostnameRegex geçerli ana bilgisayar adlarıyla eşleşir . \ Kullandığınız dile bağlı olarak \ ile kaçmanız gerekebilir.
ValidHostnameRegex , RFC 1123 uyarınca geçerlidir . Başlangıçta RFC 952 , ana bilgisayar adı segmentlerinin bir rakamla başlayamayacağını belirtmiştir.
http://en.wikipedia.org/wiki/Hostname
RFC 952'deki ana bilgisayar adlarının özgün belirtimi, etiketlerin bir rakamla veya kısa çizgiyle başlayamayacağını ve kısa çizgiyle bitmemesini zorunlu kılmıştır. Ancak, sonraki bir belirtim ( RFC 1123 ), ana bilgisayar adı etiketlerinin rakamlarla başlamasına izin verdi.
Valid952HostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$";
éxämplè.com
= xn--xmpl-loa1ab.com
) ve sonra doğrulanmalıdır.
123.456.789.0
ve geçerli bir ana bilgisayar adı olduğunu söylüyor.
Smink ana bilgisayar adı normal ifadesi bir ana bilgisayar adı içindeki tek tek etiketlerin uzunluğundaki sınırlamaya . Geçerli bir ana bilgisayar adındaki her etiket en fazla 63 sekizli uzunluğunda olabilir.
ValidHostnameRegex = "^ ([a-z-0-9] | [a-z-0-9] [a-z-0-9 \ -] {0,61} [a-z-0-9]) \ (\ ([A-z-0-9] |. [A-z-0-9] [a-z-0-9 \ -] {0,61} [a-z-0-9])) * $"
İlk satırın sonundaki (yukarıda) ters eğik çizginin, uzun satırı bölmek için Unix kabuk sözdizimi olduğunu unutmayın. Normal ifadenin bir parçası değil.
İşte tek bir satırda sadece normal ifade:
^ ([A-z-0-9] | [a-z-0-9] [a-z-0-9 \ -] {0,61} [a-z-0-9]) (\. ([a-z-0-9] | [a-zA-Z0-9] [a-zA-Z0-9 \ -] {0,61} [a-z-0-9])) * $
Ayrıca , ana bilgisayar adının toplam uzunluğunun 255 karakteri geçmediğini ayrıca kontrol etmelisiniz . Daha fazla bilgi için lütfen RFC-952 ve RFC-1123'e başvurun.
/^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?(\.[a-z\d]([a-z\d\-]{0,61}[a-z\d])?)*$/i
Geçerli bir IP adresini eşleştirmek için aşağıdaki normal ifadeyi kullanın:
(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]?)){3}
onun yerine:
([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])){3}
Birçok regex motoru, OR
dizideki ilk olasılıkla eşleşir . Örneğin, aşağıdaki normal ifadeyi deneyin:
10.48.0.200
([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*
versus([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]|[a-zA-Z0-9])(\.([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])|[a-zA-Z0-9]))*
+
yerine sonunda kullanın *
.
En üstteki yayını düzenleyemiyorum, bu yüzden cevabımı buraya ekleyeceğim.
Ana bilgisayar adı için - kolay yanıt, burada egrep örneğinde - http: //www.linuxinsight.com/how_to_grep_for_ip_addresses_using_the_gnu_egrep_utility.html
egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'
Her ne kadar durum, yumruk sekizlisinde 0 gibi değerleri ve 254 (ip adresi) veya 255'ten (netmask) büyük değerleri hesaba katmıyor. Belki ek bir if ifadesi yardımcı olacaktır.
Yasal dns ana bilgisayar adına gelince, sadece internet ana bilgisayar adlarını (intranet için değil) kontrol etmeniz şartıyla, aşağıdaki snipped'i bir kabuk / php karışımı yazdım, ancak herhangi bir normal ifade olarak uygulanabilir olmalıdır.
önce ietf web sitesine gidin, yasal seviye 1 alan adlarının bir listesini indirin ve ayrıştırın:
tld=$(curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt | sed 1d | cut -f1 -d'-' | tr '\n' '|' | sed 's/\(.*\)./\1/')
echo "($tld)"
Bu, .com .org veya .ca gibi üst alan adının yasallığını kontrol eden güzel bir yeniden kod parçası vermelidir.
Ardından, ifadenin ilk bölümünü burada bulunan yönergelere göre ekleyin - http: //www.domainit.com/support/faq.mhtml?category=Domain_FAQ&question=9 (herhangi bir alfasayısal kombinasyon ve '-' sembolü, tire işareti olmamalıdır sekizlinin başlangıcı veya sonu.
(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+
Sonra hepsini bir araya getirin (PHP preg_match örneği):
$pattern = '/^(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+(AC|AD|AE|AERO|AF|AG|AI|AL|AM|AN|AO|AQ|AR|ARPA|AS|ASIA|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BIZ|BJ|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CAT|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|COM|COOP|CR|CU|CV|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EDU|EE|EG|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GOV|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|INFO|INT|IO|IQ|IR|IS|IT|JE|JM|JO|JOBS|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MG|MH|MIL|MK|ML|MM|MN|MO|MOBI|MP|MQ|MR|MS|MT|MU|MUSEUM|MV|MW|MX|MY|MZ|NA|NAME|NC|NE|NET|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|ORG|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PRO|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|ST|SU|SV|SY|SZ|TC|TD|TEL|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TP|TR|TRAVEL|TT|TV|TW|TZ|UA|UG|UK|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|YE|YT|YU|ZA|ZM|ZW)[.]?$/i';
if (preg_match, $pattern, $matching_string){
... do stuff
}
Ayrıca, denetlediğiniz dizenin 256 karakterden kısa olup olmadığını kontrol etmek için bir if ifadesi eklemek isteyebilirsiniz - http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html
Çoğu zaman, bunu sizin için yapan ve genellikle standart kütüphanede yerleşik olan kütüphaneler olduğunu belirtmek gerekir. Ve bu kütüphaneler, dört yıl önce bir Stack Overflow cevabından kopyaladığınız ve unuttuğunuz koddan çok daha sık güncellenecektir. Ve elbette, adresi size sadece bir grup grupla bir eşleşme vermek yerine, kullanılabilir bir forma ayrıştırırlar.
Örneğin, (POSIX) C'deki IPv4'ü algılama ve ayrıştırma:
#include <arpa/inet.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
for (int i=1; i!=argc; ++i) {
struct in_addr addr = {0};
printf("%s: ", argv[i]);
if (inet_pton(AF_INET, argv[i], &addr) != 1)
printf("invalid\n");
else
printf("%u\n", addr.s_addr);
}
return 0;
}
Açıkçası, örneğin bir sohbet mesajındaki tüm geçerli adresleri bulmaya çalıştığınızda bu işlevler işe yaramaz - ancak orada bile, potansiyel eşleşmeleri bulmak için basit ama aşırı bir regex kullanmak ve daha sonra kullanmak daha kolay olabilir. kütüphane onları ayrıştırmak için.
Örneğin, Python'da:
>>> import ipaddress
>>> import re
>>> msg = "My address is 192.168.0.42; 192.168.0.420 is not an address"
>>> for maybeip in re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', msg):
... try:
... print(ipaddress.ip_address(maybeip))
... except ValueError:
... pass
def isValidHostname(hostname):
if len(hostname) > 255:
return False
if hostname[-1:] == ".":
hostname = hostname[:-1] # strip exactly one dot from the right,
# if present
allowed = re.compile("(?!-)[A-Z\d-]{1,63}(?<!-)$", re.IGNORECASE)
return all(allowed.match(x) for x in hostname.split("."))
Bu en iyi Ip doğrulama regex olduğunu düşünüyorum. lütfen bir kez kontrol edin !!!
^(([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))$
/^(?:[a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9])(?:\.[a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9])?$/
İşte ANT_OPTS dışında bir proxy ana bilgisayar IP'si veya ana bilgisayar adı almak için Ant'de kullandığım bir regex. Bu, çatallı JVM için bir proxy yapılandırmadan önce bir Ant "ulaşılabilir" testi çalıştırabilmek için proxy IP'yi elde etmek için kullanıldı.
^.*-Dhttp\.proxyHost=(\w{1,}\.\w{1,}\.\w{1,}\.*\w{0,})\s.*$
\w
doğru, IP'yi yakalamayacak, sadece belirli durumlarda ana bilgisayar adını alacak.
Bunun IP adresleri için oldukça iyi çalıştığını gördüm. Üst yanıt gibi doğrular, ancak ipin izole edilmesini sağlar, böylece ip veya daha önce hiçbir metin veya daha fazla sayı / ondalık sayı olmaz.
(? <\ S)? ((: \ D | [1-9] \ d | 1 \ d \ d | 2 [0-4] \ d | 25 [0-5]) \ b |. \ b) {7} (?! \ S)
AddressRegex = "^(ftp|http|https):\/\/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,5})$";
HostnameRegex = /^(ftp|http|https):\/\/([a-z0-9]+\.)?[a-z0-9][a-z0-9-]*((\.[a-z]{2,6})|(\.[a-z]{2,6})(\.[a-z]{2,6}))$/i
bu yeniden yalnızca bu tür doğrulama için kullanılır
yalnızca http://www.kk.com http://www.kk.co.in
için çalışmıyor
IP adresleriyle ilgili olarak, baştaki sıfırların dahil edilip edilmeyeceği konusunda bazı tartışmalar olduğu görülmektedir. Bir zamanlar yaygın bir uygulamadır ve genel olarak kabul edilir, bu yüzden mevcut tercihe bakılmaksızın geçerli olarak işaretlenmeleri gerektiğini savunuyorum . Ayrıca, dizeden önce ve sonra metnin doğrulanması gerekip gerekmediği konusunda bazı belirsizlikler vardır ve yine, bence olması gerekir. 1.2.3.4 geçerli bir IP'dir, ancak 1.2.3.4.5 değildir ve ne 1.2.3.4 kısmı ne de 2.3.4.5 kısmı eşleşmeyle sonuçlanmamalıdır. Endişelerin bazıları bu ifadeyle ele alınabilir:
grep -E '(^|[^[:alnum:]+)(([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])([^[:alnum:]]|$)'
Buradaki talihsiz kısım, bir okteti doğrulayan regex kısmının, sunulan birçok çözümde olduğu gibi tekrarlandığı gerçeğidir. Bu, desenin örneklerinden daha iyi olmasına rağmen, kullanılan regex'te alt rutinler destekleniyorsa tekrarlama tamamen ortadan kaldırılabilir. Bir sonraki örnek, bu işlevlerin -P
geçişi ile etkinleştirilmesini sağlar grep
ve ayrıca ileri ve geri görüş işlevlerinden yararlanır. (Seçtiğim işlev adı octet için 'o'. Ad olarak 'octet' kullanabilirdim ama kısa olmak istedim.)
grep -P '(?<![\d\w\.])(?<o>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<o>){3}(?![\d\w\.])'
IP adresleri cümle biçimindeki bir dosyada ise, nokta nokta gösteriminin bir parçası olmadan takip edebileceğinden, noktanın işlenmesi aslında yanlış negatifler oluşturabilir. Yukarıdakilerin bir varyantı bunu düzeltir:
grep -P '(?<![\d\w\.])(?<x>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<x>){3}(?!([\d\w]|\.\d))'
>>> my_hostname = "testhostn.ame"
>>> print bool(re.match("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", my_hostname))
True
>>> my_hostname = "testhostn....ame"
>>> print bool(re.match("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", my_hostname))
False
>>> my_hostname = "testhostn.A.ame"
>>> print bool(re.match("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", my_hostname))
True
Yeni Ağ çerçevesi IPv4Address yapısı ve IPv6Address yapısı için, IP adresi bölümünü çok kolay bir şekilde ele alan failable başlatıcılara sahiptir. IPv6'da normal ifadeyle bunu yapmak, tüm kısaltma kurallarıyla zordur.
Ne yazık ki hostname için şık bir cevabım yok.
Ağ çerçevesinin yeni olduğunu unutmayın, bu nedenle sizi en son işletim sistemi sürümleri için derlemeye zorlayabilir.
import Network
let tests = ["192.168.4.4","fkjhwojfw","192.168.4.4.4","2620:3","2620::33"]
for test in tests {
if let _ = IPv4Address(test) {
debugPrint("\(test) is valid ipv4 address")
} else if let _ = IPv6Address(test) {
debugPrint("\(test) is valid ipv6 address")
} else {
debugPrint("\(test) is not a valid IP address")
}
}
output:
"192.168.4.4 is valid ipv4 address"
"fkjhwojfw is not a valid IP address"
"192.168.4.4.4 is not a valid IP address"
"2620:3 is not a valid IP address"
"2620::33 is valid ipv6 address"
php üzerinde: filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip'
... mywebsite.co.in, thangaraj.name, 18thangaraj.in, thangaraj106.in vb. Gibi ana bilgisayar adlarını kontrol etme,
[a-z\d+].*?\\.\w{2,4}$
inet_aton
yeterince iyi.
\ D + [.] \ D + [.] \ D + [.] \ D + ile eşleşen IP adresi için bu basit normal ifade eşleme desenini düşündüm
^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
ve tabii ki doğru yol olmayacak bir şeyle görünümlerin sayısına dikkat etmelisiniz . Komut dosyası yazmak için bir diliniz varsa, kesinlikle ağ işlevlerine erişebileceksiniz. GERÇEK bir ip kontrol etmek için en iyi yolu bu sisteme dönüştürmek ve ip doğru formatta söylemek sonra doğru / yanlış kontrol etmek. Python kullanıyorum socket.inet_aton(ip)
. PHP u gerek durumunda inet_aton($ip)
.