2013-10-24 2 views
0

Java에서 Minecraft Bukkit 플러그인을 프로그래밍하려고합니다. IP를 채팅에 배치 할 때 찾을 수 있으므로 정규식을 사용하고 있습니다. 내가 필요로하는 문자열은 문자열의 어느 위치에서나 찾을 수있는 문자이며, 그 뒤에는 127.0.0.1과 같은 다른 문자가 오는 마침표가 붙지 만 This IP: 127.0.0.1 is your localhost IP과 같은 문자가있는 문자를 찾을 수 있어야합니다. 이것은 내 현재 코드 :이 코드는 127.0 만 그런 일을 검색합니다Java Regex 모든 문자열에서 문자 찾기

Pattern p = Pattern.compile("[a-z1-9]" + "." + "[a-z1-9]"); 
Matcher matcher = p.matcher(message); 
if(matcher.matches()){ 
    player.sendMessage(plugin.prefix + "§7You cannot advertise an IP address!"); 
    event.setCancelled(true); 
} 

하지만 위에서 말했듯이 그 의미를 만들어 있다면, 그것은 임의의 문자열에 [letter/number].[letter/number]의 양을 찾아야합니다.

+1

일부 [정규식 가이드]를 판독한다 (http://www.regular-expressions.info/tutorial.html) 또는 질문을하기 전에 [[regex for IP] (http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address)를 검색하십시오. '.'는 특수 문자로 "새 줄 표시를 제외한 모든 문자"와'[a-z1-9]'는'az '또는'1-9 '범위의 * 하나 * 문자와 일치하므로 추가 할 필요가 있습니다. 한정어. 또한 IPv4와 일치시키고 싶다면'a-z'가 정규 표현식에서 무엇을하고 있습니까? – Pshemo

+0

@Pshemo plsgogame의 대답에 대한 의견을 읽으십시오. – DonkeyCore

+0

'jointhis.server.com'과 같은 호스트 네임을 찾으려면 이전에 언급 한 질문에 대한 답변을 꼭 읽어야합니다. – Pshemo

답변

1

내가 필요로하는 것은 문자열의 어느 위치에서나 문자 뒤에 마침표가오고 그 다음에 다른 문자가 오도록하는 것입니다. 나는 [문자/숫자]의 금액을 찾을 필요. [문자/숫자] 임의의 문자열에, 그 의미 만든 경우 ...

은 당신이 여기에서 할 수있는 일은 대한 일치하는 단어 경계 \b을 사용하는 것입니다 이러한 패턴은 큰 텍스트로 표시됩니다.

간단한 해결책을 위해 다음과 같은 것을 사용할 수 있습니다.

\\b((?:(?:[0-9]{1,3}\\.){3}[0-9]{1,3}|(?:[a-z0-9]+(?:-[a-z0-9]+)*\\.)+[a-z]{2,4}))\\b 

예 :

import java.util.regex.*; 

class rTest { 
    public static void main (String[] args) { 
    String in = "Let's match 127.0.0.1 being valid, or this IP: 127.0.0.1 and joinTHIS.server.com or build 1.2"; 
    String re = "\\b((?:(?:[0-9]{1,3}\\.){3}[0-9]{1,3}|(?:[a-z0-9]+(?:-[a-z0-9]+)*\\.)+[a-z]{2,4}))\\b"; 
    Pattern p = Pattern.compile(re, Pattern.CASE_INSENSITIVE); 
    Matcher m = p.matcher(in); 
    while (m.find()) { 
     System.out.println(m.group(1)); 
    } 
    } 
} 

출력

127.0.0.1 
127.0.0.1 
joinTHIS.server.com 
+0

굉장! 내가 정규식을 조금 바꿨어. (부부를 추가했다.) IP, 호스트 네임, 그리고 그것을 둘러싼 어떤 문자열에서도 완벽하게 작동한다. 감사 :) – DonkeyCore

1

읽어주십시오 : link

PADDRESS_PATTERN = 
    "([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])"; 
+0

OP의 응용 프로그램에 대한 IP 주소를 찾지 못하게하는 것은 시작과 끝에만'^'와'$'만 쓰면됩니다. 그 외에는 아주 좋은 대답입니다. –

+0

정말이 답변을 좋아해요. 대부분 작동하지만, 무작위로 어딘가에 던져진 문자열 안에 문자열을 찾을 수 있어야합니다. 또한 일부 IP는 사용자 지정 IP를 사용할 수 있으므로 문자도 함께 사용할 수 있습니다. jointhis.server.com 또는 무엇인가 – DonkeyCore

+0

@BenBarkay thx, 고정. – plsgogame

0

이 시도 : 이것은 단순히 마침표로 구분 된 4 개의 3 자리 숫자의 순서를 찾을 수

Pattern.compile("(\\d{1,3}\\.){3}\\d{1,3}"); 

.

편집 : plsgogame의 대답에는 IP 주소 (0과 255 사이의 숫자 만 포함 할 수 있음)를 찾는 더 좋은 패턴이 포함되어 있습니다.

0

정규 표현식은 '.'을 이스케이프 처리하지 않기 때문에 [a-z0-9]로 시작하고 끝나는 길이가 3 인 문자열과 일치합니다. 어떤 문자든지 의미합니다. 또한 괄호 안의 문자 집합을 반복해야합니다. 뒤에 마침표 하나 개 이상의 숫자 마지막 세 번 하나 개 이상의 숫자를 일치

[\d]*\.[\d]*\.[\d]*\.[\d]* 

: 예를 들어, 당신은 같은 것을 사용할 수 있습니다. 즉, 양식 '123.456.789.101'의 모든 문자열에 대해 일치 항목을 얻을 수 있지만 '122533252.13242351432142.375547547.62463636'과 같은 항목도 있으므로 완전히 도움이되지는 않습니다. 점으로 구분 된 세 자리의 그룹과 일치하는 것입니다

[\d][\d][\d]\.[\d][\d][\d]\.[\d][\d][\d]\.[\d][\d][\d] 

:

개선점, 그러나 완벽하지, 다음입니다. 당신이 초보자 있다면 이해하는 것이 훨씬 더 재미 있고 효과적인뿐만 아니라 더 어려운 뭔가 빨리 감기를 할 경우, 예를 사용할 수 있습니다

on this page을 발견, 즉 : 정확하지

\b(?:(?: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]?)\b 

당신이 필요로하는 것.

또한 matches() 메소드는 입력의 모든 부분이 아닌과 일치하므로 정규 표현식의 처음과 끝에 '. *'을 추가하고 자바 코드에서 실행할 수 있습니다 같은 :

Pattern p = Pattern.compile(".*\\b(?:(?: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]?)\\b.*"); 
Matcher matcher = p.matcher(message); 
if (matcher.matches()) System.out.println("It's a match"); 

당신은 당신이 대신 할 수있는 모든 IP를 찾아 하려면 : 학습 곡선은 가파른이지만

Pattern p = Pattern.compile("\\b(?:(?: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]?)\\b"); 
Matcher matcher = p.matcher(message); 
while (matcher.find()) System.out.println("Match: " + matcher.group()); 

정규 표현식에이 훌륭합니다. 그래서 행운을 빕니다!

관련 문제