2013-05-07 2 views
0

아래 코드에서와 같이 와일드 카드로 목록 (lMapValues)을 가지고 있습니다. 일치하는 URL을 찾으려면 URI와이 목록을 비교해야합니다.URL 목록에서 특정 URI와 일치하는 정규식 패턴

아래 코드에서지도의 m 값과 일치하는 URL을 가져야합니다. 즉, uri의 일부가 url 목록에서 일치하는 경우 특정 URL을 선택해야합니다.

토큰에서 URI를 분할하고 목록의 각 토큰을 확인해 보았습니다. lMapValues. 그러나 정확한 결과를 제공하지 못했습니다. 아래 코드는 그 코드입니다.

public class Matcher 
{ 
    public static void main(String[] args) 
    { 
     Map m = new HashMap(); 
     m.put("a","https:/abc/eRControl/*"); 
     m.put("b","https://abc/xyz/*"); 
     m.put("c","https://work/Mypage/*"); 
     m.put("d","https://cr/eRControl/*"); 
     m.put("e","https://custom/MyApp/*"); 

     List lMapValues = new ArrayList(m.values()); 
     List tokens = new ArrayList(); 

     String uri = "cr/eRControl/work/custom.jsp"; 

     StringTokenizer st = new StringTokenizer(uri,"/"); 
     while(st.hasMoreTokens()) { 

      String token = st.nextToken(); 
      tokens.add(token); 
     } 

     for(int i=0;i<lMapValues.size();i++) { 
      String value = (String)lMapValues.get(i); 
      String patternString = "\\b(" + StringUtils.join(tokens, "|") + ")\\b"; 
      Pattern pattern = Pattern.compile(patternString); 
      java.util.regex.Matcher matcher = pattern.matcher(value); 

      while (matcher.find()) { 
       System.out.println(matcher.group(1)); 
       System.out.println(value); 
      } 
     } 
    } 
} 

위의 목표를 달성하려면 정규식 패턴으로 도와주세요. 도움이 될 것입니다.

+0

당신은 정답을 제공하지 않는 무엇을 의미합니까? 정답은 무엇입니까? 투입물과 기대되는 결과의 예를 제시 할 수 있습니까? – Elmer

+0

나는 여기에 입력을 언급했다. String uri = "cr/eRControl/work/custom.jsp"; 일치하는 URL을 목록에서 https : // cr/eRControl/*로 반환해야합니다 –

답변

0

문제는 i 당신이 더 나은 목록지도를 교환 제공됩니다

String value = (String)lMapValues.get(i); 

에 인덱스로하지 중요한 역할을하고, 각 for 루프를 사용하고 있다는 점이다.

List<String> patterns = new ArrayList<String>(); 
... 
for (String pattern : patterns) { 
    .... 
} 
0

String.indexOf()으로 문자열이 특정 값으로 시작하는지 확인하는 것이 훨씬 간단합니다.

String[] urls = { 
    "abc/eRControl", 
    "abc/xyz", 
    "work/Mypage", 
    "cr/eRControl", 
    "custom/MyApp" 
}; 

String uri = "cr/eRControl/work/custom.jsp"; 

for (String url : urls) { 
    if (uri.indexOf(url) == 0) { 
     System.out.println("Matched: " + url); 
    }else{ 
     System.out.println("Not matched: " + url); 
    } 
} 

또한. 절대 일치하지 않을 계획이라면 맵에 스키마를 저장할 필요가 없습니다.

0

목표를 올바르게 이해하면 정규 표현식이 필요하지 않을 수도 있습니다.

이 시도

...
package test; 

import java.util.HashSet; 
import java.util.Set; 

public class PartialURLMapper { 

    private static final Set<String> PARTIAL_URLS = new HashSet<String>(); 
    static { 
     PARTIAL_URLS.add("cr/eRControl"); 
     // TODO add more partial Strings to check against input 
    } 
    public static String getPartialStringIfMatching(final String input) { 
     if (input != null && !input.isEmpty()) { 
      for (String partial: PARTIAL_URLS) { 
       // this will be case-sensitive 
       if (input.contains(partial)) { 
        return partial; 
       } 
      } 
     } 
     // no partial match found, we return an empty String 
     return ""; 
    } 
    // main method just to add example 
    public static void main(String[] args) { 
     System.out.println(PartialURLMapper.getPartialStringIfMatching("cr/eRControl/work/custom.jsp")); 
    } 

} 

... 그것은 반환합니다

cr/eRControl