2012-04-17 3 views
1

나는 예를 들어, IP 주소의 연결에 의해 형성되는 문자열이 : 새로운 IP 주소가 주어지면문자열이 더 큰 문자열의 일부인지 확인하는 가장 효율적인 방법은 무엇입니까?

"127.272.1.43;27.27.1.43;127.127.27.67;128.27.1.43;127.20.1.43;111.27.1.43;127.27.1.43;" 

, 나는 IP 상반기는 IP 주소의 일부인지 확인해야 끈. 문자열의 IP 주소 중 하나가 "127.27"

로 시작하는 경우 예를 들어, "127.27.123.23" 경우 주어진 내가 찾아야 I userIP = "127.27."

int i = StringUtils.indexOf(dbIPString, userIP); 
do { 
    if (i > 0) { 
     char ch = dbIPString.charAt(i - 1); 
     if (ch == ';') { 
      System.out.println("IP is present in db"); 
      break; 

     } else { 
      i = StringUtils.indexOf(dbIPString, userIP, i); 
     } 
    } else if (i == 0) { 
     System.out.println("IP is present in db"); 
     break; 
    } else { 

     System.out.println("IP is not present in db"); 
    } 
} while (i >= 0); 

이 될 수있는 다음과 같은 코드가 더 효율적이? 또는 정규식을 사용할 수 있습니까? 어느 것이 더 효율적입니까?

+0

당신은'127.255.1.43' 같은 문자열이 일치 하시겠습니까? (나는 당신의 질문에서'127.272.1.43'보다 더 정상적인 예제를 선택했습니다.) ... –

+0

@TimPietzcker 미안 해요 누군가가 편집하고 27 점 뒤에있는 점을 제거했습니다. 나는 그것을 다시 추가했습니다 –

답변

1

일반 문자열 일치는 대개 정규식 일치보다 빠릅니다. 나는 간단하게이 같은 것을 할 거라고 : 당신은 항상 목록을 시작하기 위해 준비 할 수있는 경우

if (StringUtils.startsWith(dbIPString, userIP)) { 
    ... // prefix is present 
} else if (StringUtils.indexOf(dbIPString, ";" + userIP) > 0) { 
    ... // prefix is present 
} else { 
    ... // prefix is not present 
} 

을에 ';' 첫 번째 엔트리를 검색하는 것이 더 이상 특별한 경우가 아니며 로직을 단순화 할 수 있습니다.

목록이 크고 이러한 검색을 많이하고 속도가 중요한 경우 다음 주소 목록을 작성할 때 해시 또는 트리에 각 접두사를 추가 할 수 있습니다. 이러한 데이터 구조의 조회는 문자열 일치보다 빠릅니다.

+0

+1 더 똑똑한 데이터 구조 문자열은 빠른 접두사 검색을 지원하기위한 것이 아닙니다. IP 주소의 트리를 만드는 경우,이 질문은 사소한 것이됩니다. (정규 표현식 대신에 일반 오래된 문자열 루틴의 사용을 제안하는 또 다른 +1을 주겠지 만 한 번만 상향 변환 할 수 있습니다.;)) –

+0

부분 일치도 찾습니다. 예를 들어'127.25'를 찾고 있다면'Darshan '이 기대하지 않는'127.255.1.43'을 발견 할 수 있습니다. –

+0

@TimPietzcker 아니 .. 우리가 "127.25"를 찾고 있기 때문에. –

0

만 전체 IP 주소 일치에 대한 관심 있다고 가정하면, 당신은 피팅 정규식 될 것이다 다음, 127.25에 대한

(?<=^|;)127\.25\.\d+\.\d+ 

을 찾을 때 일치 원하지 않는 127.255.1.43 가정. 자바에서

:`127.25`를 찾을 때

Pattern regex = Pattern.compile(
    "(?<=^|;)  # Assert position at the start of the string or after ;\n" + 
    Pattern.quote(userIP) + 
    "\\.\\d+\\.\\d+ # Match .nnn.nnn", 
    Pattern.COMMENTS);