2010-03-03 3 views
0

스캐너가 주어진 구분 기호를 토큰으로 사용하게하는 좋은 방법을 찾으려고합니다. 예를 들어, 텍스트를 숫자와 숫자가 아닌 덩어리로 나눠서 처리하고 싶습니다. 따라서 이상적으로는 구분자를 \D으로 설정하고 useDelimiterAsToken과 같은 플래그를 설정해야합니다. 그러나 API를 잠시 살펴본 후에는 아무 것도 나오지 않아. 지금 내가 다소 고통스러운 구분 기호에 대한 결합 lookaheads/lookbehinds를 사용에 의존 했어 :Java : 스캐너 구분 기호를 토큰으로 사용하십시오.

scanner.useDelimiter("((?<=\\d)(?=\\D)|(?<=\\D)(?=\\d))"); 

이 아닌 자리 또는 그 반대로 숫자에서 어떤 전환을 찾습니다. 이것을하기에 더 좋은 방법이 있습니까?

+0

참조 : http://stackoverflow.com/questions/2206378/how-to-split-a-string-but-also-keep-the-delimiters, 아마도 도움이됩니다. –

+0

문제는'\ d' 또는'\ d +'에 대해 똑같은 일을한다면 너무 많은 곳에서 일치 할 것입니다. – daltonb

답변

1

편집 : 편집 된 질문이 너무 다르므로 내 원래 답변이 전혀 적용되지 않습니다. 기록을 위해, 으로 문제를 해결하는 이상적인 방법이라고 생각합니다. 구분 기호는 숫자와 숫자 사이의 제로 너비 경계이며 게시 한 것보다 더 명확하게 표현할 수있는 방법이 없습니다. 원래이 정규식에 대한 대안을 요구 (주석에서 묻는 질문에 대한 응답에서.) :

EDIT2

"((?<=\\w)(?=[^\\w])|(?<=[^\\w])(?=\\w))" 

거의 정확히 어떻게 \b, 단어 경계 구조는 작동합니다

"(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)" 

즉, 단어 문자가 앞에오고 그 뒤에 하나 또는 단어 문자가오고 뒤에 하나가없는 위치입니다. 차이점은 \b이 입력의 시작과 끝에서 일치 할 수 있다는 것입니다. 당신은 분명히 그것을 원하지 않았다, 그래서 나는 이러한 조건을 제외 lookarounds 추가 :

"(?!^)\\b(?!$)" 

그것은 당신의 정규식 무슨 짓을 할 수있는보다 간결 방법은 그냥. 그런 다음 요구 사항을 숫자/비 자릿수 경계와 일치시키는 것으로 변경했으며 단어/비 단어 경계에 대해서는 \b과 같은 약어가 없습니다.

+0

그들은 이미 내가 사용하고있는 정규 표현식에서 예방할 수 있습니다. – daltonb

+0

나는 똑같은 것을 성취하기 위해 더 짧은 정규식을 제안하고 있었다. 그러나 요구 사항을 변경 했으므로 이제는 관련이 없습니다. –

+0

나는 첫 번째 경우에서 당신의 솔루션이 어떻게 도움이되었는지 혼란스러워합니다. 단어 대신 숫자를 사용하는 경우를 제외하고는 이제 같은 문제입니다. 단어 경계가 옵션이되기를 원하지 않았습니다. 실제로 좀 더 복잡한 작업을하고 있기 때문입니다. – daltonb

관련 문제