2012-12-05 2 views
5

영문자가 아닌 문자를 따라 문자열을 문자열 배열로 분할하려고합니다. 예를 들어 :자바 문자열 비 알파벳 문자로 나누기

"Here is an [email protected]" => "Here", "is", "an" "ex", "mple" 

나는 정규 표현식 "(?![\\p{Alpha}])"String.split(String regex) 방법을 사용했습니다. 그러나 이렇게하면 문자열을

"Here", "_is", "_an", "_ex", "@ample" 

(이 경우 밑줄에는 공백이 있음)으로 나눕니다. 이것은 ?! 정규 표현식 연산자가 "제로 - 너비"이고 실제로 입력 문자열에서 비 알파벳 문자 앞에 0 바이트 문자를 분리하고 제거하기 때문입니다.

문자열을 분리하는 동안 실제 비 알파 문자를 제거하려면 어떻게해야합니까? 너비가 0 인 너비 연산자가 있습니까? (모든 알파벳 문자와 일치 \p{Alpha}, 반대)

"Here is an [email protected]".split("\\P{Alpha}+") 
 
["Here", "is", "an", "ex", "mple"] 

\P{Alpha} 어떤 알파벳이 아닌 문자와 일치 :

+0

\ W +가 작동합니까? – Thilo

+0

http://stackoverflow.com/questions/11332772/java-string-split-on-all-non-alphanumeric-except-apostrophes –

+0

@Thilo 밑줄로는 작동하지 않습니다. – arshajii

답변

11

당신은 \P{Alpha}+ 시도 할 수 있습니다. +은 이러한 문자의 연속 문자열을 분리해야 함을 나타냅니다.

"[email protected]#$%^&*b".split("\\P{Alpha}+") 
 
["a", "b"] 
+0

완벽하게 작동했습니다. 제안과 설명에 감사드립니다! – dmoench

+0

"Madam, 나는 Adam"을 넣으면 쉼표와 아포스트로피를 없애고 "Madam"다음에 "I 'm"앞에 공백을 둡니다. 그게 예상되는 행동인가요, 아니면 분열 된 것입니까? "| \\ s +"에 추가하면 공백을 제거하지 않습니다. – Ungeheuer

0

다른 답변 외에도 문자열의 문자를 반복하고 ASCII 값이 대문자와 소문자 범위에 있는지 테스트하고 그렇지 않은 경우 원하는 '분할'동작을 수행 할 수 있습니다.

char[] chars = str.toCharArray();이 유용 할 수 있습니다.

2

이미 여러 답변이 있지만 국제화 문제를 다루는 사람은 없습니다. OP 예제에서 "영문"글자라고 가정해도 검색에서 여기 오는 방문자의 경우는 아닙니다 ...

... 그래서 그 가치가있는 것은 자바입니다. Unicode Technical Standard #18 "Unicode Regular Expressions"을 지원합니다. 꽤 인상적이지 않니? 명확하게 이것은 국제 문자를 다루기 위해 지정된 고전적인 (라틴 중심 또는 이벤트 영어 중심의) 정규 표현식의 확장입니다.

예를 들어 문자가 유니 코드 코드 포인트 문자 클래스 중 하나에 속하는지 확인하려면 Java supports the full set of binary properties을 확인하십시오. 특히 \p{IsAlphabetic} 문자 클래스는 유니 코드 지원 언어의 문자에 해당하는 모든 알파벳 문자와 일치합니다.

확실하지 않습니까?

Pattern p = Pattern.compile("\\p{IsAlphabetic}+"); 
    //       ^^^^^^^^^^^^^^^^^ 
    //       any alphabetic character 
    //     (in any Unicode-supported language) 

    Matcher m = p.matcher("L'élève あゆみ travaille _bien_"); 
    while(m.find()) { 
     System.out.println(">" + m.group()); 
    } 

또는 -alphabetic 문자 휴식 분할을 사용하여 대부분 해당 : 두 경우 모두

for (String s : "L'élève あゆみ travaille bien".split("\\P{IsAlphabetic}+")) 
     System.out.println(">" + s); 

는, 출력이 제대로 토큰 화 단어, 고려합니다 프랑스 강조 여기에 예입니다 문자 및 일본어 히라가나 문자 - 유니 코드 지원 언어 (supplementary multi-lingual plane 포함)를 사용하여 철자가 된 것과 같습니다.