2011-03-09 7 views
2

10 개의 정규 표현식과 정확히 10 개의 정규 표현식 중 하나와 일치하거나 일치하지 않는 1 개의 문자열이 있습니다. 누구든지 내 정규 표현식 (있는 경우)이 내 문자열과 일치하는지 파악하는 간단한 방법을 알고 있습니까? 나는 문자열에 대해 각각을 간단히 테스트 할 수 있다는 것을 알고 있지만 정규 표현식과 문자열을 입력 할 수있는 라이브러리가 있는지 알고 싶습니다. 정규 표현식이 일치하는지 알려줄 것입니다. 결과 정규 표현식마다 비즈니스 로직이 달라지기 때문에 일치하는 정규 표현식을 알아야합니다.어떤 정규식이 내 문자열과 일치하는지 어떻게 알 수 있습니까?

답변

4

찾고 계신 API는 다음과 같습니다. 10 개의 표현식 각각에 대해 호출하십시오!

public boolean testMatch(String data, String regEx) { 
    return data.matches(regEx); 
} 

더 일반적으로 만들어 보겠습니다.

public String testMatch(String data, String... regExs) { 
    for(String regEx : regExs) { 
     if(data.matches(regEx)) { 
      return regEx; 
     } 
    } 

    return null; 
} 
+0

이 접근법의 단점은 'testMatch' 메소드를 호출 할 때마다 모든 패턴을 다시 컴파일해야한다는 것입니다. – redent84

+0

예, 물론 우리는 당신이 보여준 것처럼 미리 컴파일 된 패턴을 가질 수 있습니다. 그러나 정규 표현식의 목록은 동적입니다. 'Pattern.compile'을 사용하면 많이 절약하지 못할 것입니다. – adarshr

0

이 밖으로 시도 :

String charsequence = "Whatever"; 
List<Pattern> patterns = null/* Place here all your RegExp*/; 

Matcher matcher = null; 
for (Pattern p: patterns) { 
    matcher = p.matcher(charsequence); 
    if (matcher.matches()) { 
     // It matches, do stuff 
     break; 
    } 
} 

그것이 도움이되기를 바랍니다.

감사

+0

외부 소스에서 온 - 어일 (on-the-fly) 방식으로 사전 컴파일 할 수 있는지 미리 알 수는 없으므로 사전 컴파일로 거의 이점을 얻을 수 없습니다. – adarshr

0

당신이 표현이 일치하는에 따라 다른 논리를 가지고가는 것을보고. 나는 당신이 각 옵션을 반복하는 것을 피할 수 있다고 생각하지 않는다. (또는 각 옵션을 통해 다른 클래스 루프를 갖는 것).

정규 표현식과 동작을 수행하는 클래스를 만들 수 있으며 String을 해당 클래스에 전달하고 일치하는 것으로 판단 할 때 액션을 수행하고 구조와 같은 스위치를 사용하여 수행 할 동작을 결정하도록 할 수 있습니다 .

+0

대체품이나'|'는 비싸다. – adarshr

+0

@Adarshr, 가장 비싼 옵션을 묻지 않았다. 게다가 그것은 10 개의 개별 경기보다 훨씬 비쌉니까? – jzd

+0

당신 말이 맞아요. 이것은 패턴 매칭의 반대이므로,별로 중요하지 않습니다. 하지만 일반적인 메모에서 확실히 중요합니다. 그렇죠? – adarshr

관련 문제