2010-04-28 3 views
5

쉼표, 세미콜론 또는 공백 (또는 세 가지 조합)으로 입력 문자열을 분할 할 수 있어야합니다. 입력에서 여러 개의 연속 된 구분 기호를 하나의 구분 기호로 취급하고 싶습니다. 여기에 지금까지이 작업은 다음과 같습니다String.split() - 첫 번째 구분 기호 앞에 빈 빈 문자열이 일치합니까?

String regex = "[,;\\s]+";  
return input.split(regex); 

이 입력 문자열이 결과 배열의 첫 번째 요소가 빈 문자열 인 경우, 구분 문자 중 하나를 시작할 때를 제외하고 작동합니다. 내 결과에 빈 문자열이있는 것을 원하지 않으므로 ",,,, ZERO;, ;; ONE, TWO;"는 대문자로 된 문자열을 포함하는 세 요소 배열 만 반환합니다.

String.split을 호출하기 전에 내 reg-ex와 일치하는 선행 문자를 제거하는 것보다 더 좋은 방법이 있습니까?

미리 감사드립니다.

+0

Java 정규식 API를 기억하지 못해 답변으로 게시하지 않지만 단순히 구분 기호로 구분하는 대신 구분 기호가 아닌 문자열을 검색 할 수 있습니다. '[^,; \ s] +'와 같은 정규 표현식을 사용합니다. –

+0

분명히 똑같은 질문이지만 최신이지만 답변이 더 좋음 : https://stackoverflow.com/questions/9389503/how-to-prevent-java-lang-string-split-from-creating-a-lead-empty-string –

답변

3

"더 좋아"라고 말하면 더 높은 성능을 의미합니다. 일치하려는 정규 표현식을 만들고 루프 내에서 Matcher.find을 사용하고 일치하는 항목을 찾아내는 것이 좋습니다. 이렇게하면 문자열을 먼저 수정하지 않아도됩니다. 그러나 귀하의 데이터에 대해 더 빠른 것을 스스로 측정하십시오.

"더 좋음"을 더 간단하게 말하면 나에게 제안한 방식보다 간단한 방법이 있다고 생각하지 않습니다. 분할을 적용하기 전에 선행 구분 기호를 제거하십시오. 그러나, 당신이 별도로 각각의 잠재적 공백 문자를 정의해야합니다,주의해야로서

StringTokenizer st = new StringTokenizer(",,,ZERO;,ONE TWO", ",; ", false); 
while(st.hasMoreTokens()) { 
    String str = st.nextToken(); 
    //add to list, process, etc... 
} 

:

6

아니요, 없습니다. 당신은 문자열의 분할에 두 번째 매개 변수로 0을 제공하여 구분 기호를 후행 무시할 수() 메소드 :

return input.split(regex, 0); 

하지만 구분 기호를 선도을 위해, 먼저 그들을 제거해야합니다 : 경우와

return input.replaceFirst("^"+regex, "").split(regex, 0); 
+0

음의 매개 변수? 'n이 0이면 패턴은 가능한 한 많이 적용되고 배열은 길이를 가질 수 있으며 빈 문자열은 무시됩니다 .' http://java.sun.com/javase/6/docs/에서 api/java/lang/String.html # split % 28java.lang.String, % 20int % 29 –

+0

으악, 네, 의미는 0입니다. 감사합니다! –

+0

+1 그것을 고치기 위해 :) –

1

당신은 또한 잠재적으로 당신이 그것으로 무엇을해야하는지 따라 목록을 작성할 수 StringTokenizer를 사용할 수 있습니다 생성자의 두 번째 인수

2

JDK에 내장 된 거의 모든 분할 기능이 단절된 것입니다. 당신은 타사가 비어 토큰 및 공백을 처리하는 방법에 유연하고 정확한 둘 다 클래스와 같은 Splitter 사용하여 더 나을 것 :

Splitter.on(CharMatcher.anyOf(";,").or(CharMatcher.WHITESPACE)) 
    .omitEmptyStrings() 
    .split(",,,ZERO;,ONE TWO"); 

"ZERO"를 포함하는의 Iterable < 문자열> 얻을 것이다, "ONE", "TWO"

관련 문제