2012-10-22 3 views
0

Scanner을 사용하여 단어 경계에서 문자열을 분할하고 싶습니다. 일반적으로,이는 다음과 같이 할 것입니다 : [a-zA-Z0-9#/] : 나는 좀 더 문자를 포함하고 _을 제외 할로Look-Ahead 및 Look-Behind를 사용하여 사용자 지정 경계 일치자를 만드는 방법은 무엇입니까?

Scanner scanner = new Scanner(...).useDelimiter("\\b"); 

문제는 "단어"문자의 나의 정의는 표준 [a-zA-Z_0-9]에서 작은 조금 다른 점이다 . 따라서 \b 패턴을 사용할 수 없습니다.

그래서 내가보기 미리를 사용하여 같은 일을 봐 숨김려고했는데, 내가 해낸 작동하지 않았다 :

(<?=[A-Za-z0-9#/])(?![A-Za-z0-9#/])|(<?![A-Za-z0-9#/])(?=[A-Za-z0-9#/]) 

스캐너는이를 사용하여 어디서든 분할하지 않습니다.

미리보기와 뒤 비켜보기를 사용하여이를 수행 할 수 있습니까?

+0

그냥 사소한 점,하지만'\의 b'의 당신의 "표준"정의는 잘못된 것입니다. –

+0

나는 하나주지 않았지만'(? <= \ w) (?! \ w) | (? rolve

+1

Java 7과 그 새로운 [UNICODE_CHARACTER_CLASS] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern)를 사용하는 경우 이것이 어떻게 * 가정 된 * 것인지를 정의합니다. html # UNICODE_CHARACTER_CLASS) 모드입니다. 하지만 자바의 유산 '\ b'는 좀 더 창의적입니다. 자세한 내용은 [이 질문] (http://stackoverflow.com/q/4304928/20938)을 참조하십시오. 특히 @ tchrist의 대답. –

답변

3

T 여기에 구문 오류가 있습니다. ?는 먼저 :

(?<=[A-Za-z0-9#/])(?![A-Za-z0-9#/])|(?<![A-Za-z0-9#/])(?=[A-Za-z0-9#/]) 
^^         ^^ 
+0

나는 그것을 믿을 수 없어 ... 고마워. – rolve

0

잘못된 것입니다 : 즉

[^A-Za-z0-9#/]+ 

워드되지 않습니다 세트에서 적어도 하나 개의 성격의 실행 설정

하거나 공간을 필요로하는 경우

[^A-Za-z0-9#/ ]+ 

스캐너를 사용한 후 특수 처리를 위해 공간을 제거한 다음 (필요한 경우)

+0

나는 단어들 사이에 공백이 필요하다. 스캐너는 정규식을 사용하여 스캐너를 삼킨다. – rolve

+1

나는 OP가 공백을 별도의 "단어"/ 토큰 또는 우리가 무엇이라고 부를지를 생각합니다 :) – Pshemo

+0

별도의 토큰으로, 예. – rolve

1
new Scanner(...).useDelimiter(
    "(?<=[a-zA-Z0-9#/])(?=[^a-zA-Z0-9#/])|(?<=[^a-zA-Z0-9#/])(?=[a-zA-Z0-9#/])"); 
+0

아니요. 앞과 뒤의 문자가 필요하므로 문자열의 시작 또는 끝에있는 단어 경계와 일치하지 않습니다. OP는 올바른 수식을 가지고 있으며 구문에 약간의 오류가 있습니다. –

+0

@AlanMoore - 구분 기호는 ** "단어"사이의 ** 것입니다. 다시 생각해보십시오 ... –

+0

그는 단어 문자에 대한 자신의 정의에 부합하는'\ b'에 해당하는 것을 만들려고합니다. 그의 정정 된 정규 표현식은 스캐너의'useDelimiter()'메소드와 함께 사용할 때와 정확히 똑같이 작동한다. 나는 내 주석을 쓸 때 깨닫지 못했다. 그러나 제 생각은 여전히 ​​유효하다고 생각합니다. 당신의 대답이 그의 문제를 해결할 수는 있지만 그의 질문에는 대답하지 않습니다. –

관련 문제