2013-04-24 2 views
1

Java에서 문자열 텍스트 매개 변수와 문자열 배열을 반환하는 String "regexes"매개 변수의 배열을 사용할 수있는 메서드를 작성해야합니다.Java String Split/Manipulation

기본적으로 반환 된 배열은 String.split을 수행하지만 여러 문자열 정규 표현식을 사용하고 정규 표현식을 스트립하는 대신 배열에 보관합니다.

예 :
Input: "int a=10; a++;"
Regexes: "int", ";", "++", "="
Output: "int", " a", "=", "10", ";", " a", "++", ";"

그리고 아무도

public static String[] splitIntoBits(String in, String[] regex) 
{ 
    List<String> bitList = new ArrayList<String>(); 

    for(int i = 0; i < in.length(); i++) 
    { 
     int lastIndex=0; 
     //Check that character against all regexes 
     for(int j = 0; j < regex.length; j++) 
     { 
      if(in.substring(i).startsWith(regex[j])) 
      { 
       bitList.add(in.substring(lastIndex, i)); 
       lastIndex=i; 
      } 
     } 
    } 

    return bitList.toArray(new String[0]); 
} 
+0

겹치는 패턴을 어떻게 처리합니까 (즉, 일치가 모호한 경우)? – durron597

+1

각 분할 후에 새 ArrayList를 만들고 String []을 캡처하여 목록에 넣을 수 있습니다. List를 사용하여 문자열을 다음 단계로 공급하십시오. –

+0

@ durron597 - 아마 전이나 후에 정규식 후에 오는 더 구체적인 검사로 처리 할 것이다. – user2317297

답변

0

당신은 모든 정규 표현식에 일치하는 하나의 정규 표현식을 구성 할 수 있습니다 일하지, 다음과 같은 몇 가지 시도 인수를 입력 한 다음 end()과 일치하는 이전 색인을 추적하는 Matcher.find()을 사용하십시오.

참고 : 아래 코드에서 Pattern.quote(r)은 '+ +'(유효하지 않은 정규식 패턴)를 처리합니다. 인수로 정규 표현식을 지원하는 경우에는 호출을 제거하십시오.

String[] regex = { "int", ";", "++", "=" }; 
    StringBuilder pattern = new StringBuilder(); 
    for (String r : regex) { 
     pattern.append('|').append(Pattern.quote(r)); 
    } 

    String input = "int a=10; a++;"; 
    Matcher m = Pattern.compile(pattern.substring(1)).matcher(input); 
    // e.g. m = Pattern.compile("int|;|\\+\\+|=").matcher(input); 
    List<String> result = new ArrayList<String>(); 
    for (int i=0 ; m.find() ; i = m.end()) { 
     if (i != m.start()) { 
      result.add(input.substring(i, m.start())); 
     } 
     result.add(m.group(0)); 
    } 
    String[] array = result.toArray(new String[result.size()]); 
+0

감사합니다. 완벽하게 작동합니다! – user2317297