2014-09-08 2 views
0

GWT에서 필드 검증을하고 있습니다. 나는 거대한 Regex (gwt는 자바 정규 표현식의 일부만을 지원한다.)은 ipv4, ipv6 & 호스트 네임을 탐지하는데 성공적으로 작동한다.IPv4, IPv6, & hostname regex

www.google.com은

192.168.1.1

2001:0db8:85a3:0000:0000:8a2e:0370:7334

또한 위의 CSV의의 동의를 필요로하고 나는 그것을 알아낼 수 없습니다. 나는 그것들을 교환 할 때가 아니라 1 종류의 CSV를 받아들이도록 할 수있다.

즉 :

하지만 1.2.3.4,2001:0db8:85a3:0000:0000:8a2e:0370:7334 작동 1.2.3.4,5.6.7.8.

저는 가깝고 정규식이 괴물이라는 것을 알고 있지만 아무도 도와 줄 수 있습니까?

private static final String IPV6_IPV4_HOSTNAME_VALIDATION_REGEX = "" 
+ "^(((([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]))(\\,)?)*$|^((([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])(\\,)?)*$" 
+ "|^((?:(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]" 
+ "|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))" 
+ "|(?:(?:::(?:(?:(?:[0-9a-fA-F]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]" 
+ "|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))" 
+ "|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))" 
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))" 
+ "|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,1}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))" 
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))" 
+ "|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,2}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))" 
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))" 
+ "|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,3}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:[0-9a-fA-F]{1,4})):)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))" 
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,4}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))" 
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,5}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:[0-9a-fA-F]{1,4})))" 
+ "|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,6}(?:(?:[0-9a-fA-F]{1,4})))?::))))(\\,)?)*$"; 
+0

이 정규식은 작동 시키더라도 유지 보수가 불가능합니다. 왜 그것을 여러 regexes로 나눠서 Java 코드에서 연속적으로 적용하지 않을까요? –

+0

실제로 도메인 이름은 점으로 끝나야합니다 (optinal (일반적으로 생략)). 또한,'''64 : ff9b :: 198.252.206.16'''과 같은 IP도 잊지 마십시오. – WhyNotHugo

답변

1

나는 GWT에 익숙하지 않다 그러나 아마 당신은 트림 한 후, 배열에 최대 주소를 분할 할 사항 String.split를 ("")를 사용하고 배열의 각 항목에 대한 유효성 검사 정규식을 적용 할 수 .

2

문법으로 돌아 가면 정규식이 뒤 따릅니다.

list := part (',' part)* 

part := ipv4 | ipv6 | hostname 

지금 자바에 그 "ABNF 같은"문법을 번역 :

private static String IPV4 = "…"; 
private static String IPV6 = "…"; 
private static String HOSTNAME = "…"; 

private static String PART = "(?:" + IPV4 + "|" + IPV6 + "|" + HOSTNAME + ")"; 
private static String LIST = "^" + PART + "(?:," + PART + ")*$"; 

참고 : 당신의 IPv4, IPv6 및 호스트 이름의 당신의 일치로 같은 논리를 적용해야합니다.

+0

굉장한 @ 토마스 나는 정규 표현식을 조작하고 문자열 변수를 다루는 대신 생각해야합니다. 1 시간 정도 걸리면 받아 들일 것입니다. 너희들도 고맙다 나는 다른 사람들이 문자열 분할로 제안한 것을 시도했지만 작동하지 않는다. 쉼표로 구분 된 값을 통해 루프를 말할 수없고 전체를 검증하기 위해 정규 표현식을 필요로하고 각각의 유효성을 검사한다. – user2130360

관련 문제