2013-04-30 5 views
2

Java에서 토큰과 함께 문자열을 분할하려고합니다. 예를 들어 ;문자열 토큰 화

String s = "A#B^C&D!ased&[email protected]%" 
String temp[] = s.split("[#^&[email protected]%]+"); 

Current output :- 
temp[0] = A 
temp[1] = B 
temp[2] = C 
temp[3] = D 
temp[4] = ased 

output which i want :- 
temp[0] = A# 
temp[1] = B^ 
temp[2] = C& 
temp[3] = D! 
temp[4] = ased& 

My current approach of doing is 
    pos = find the index of the token in string 
    pos = add the size of the token in pos 
    charAtPos = getcharfrom string at index pos 
    token = token + charAtPos 

만약 더 좋은 방법이 있다면 제안하십시오. 나는 매우 큰 문자열에 대한 접근 방식이 그리 효율적이지 않다고 생각합니다. 그래서 어쩌면 [#|^|&|!|@|%]

답변

5

입력을 캡처하지 않는 positive look-behind, 정규식 구문을 사용하여 시도해보십시오 (?<=expr) 구조는 당신이 위치에 텍스트를 분할시키는 자체를 expr을 캡처하지 않고, expr 후 포인트 오른쪽에 일치

String s = "A#B^C&D!ased&[email protected]%"; 
String temp[] = s.split("(?<=[#^&[email protected]%]+)"); 

그 구분 기호를 따르십시오.

여기에 demo on ideone입니다.

0

는 분할 위치를 찾기 위해 정규 표현식을 사용하며 이러한 토큰은 (결과에서 일치하는 그룹을 제거합니다 당신 일반적으로 원하지 않는). 토큰을 얻고 싶다면 미리보기 look-behinds를 사용하여 길이가 0 인 일치가 필요합니다.

String s = "A#B^C&D!ased&[email protected]%" 
String temp[] = s.split("(?<=[#^&[email protected]%]+)"); 

식은 후 토큰 각 위치 일치 길이 제로 매치를 생성하도록 변경된다. 따라서 결과에는 토큰도 포함됩니다.

+0

하지만 제 경우에는 정상적으로 작동합니다. 예상대로 결과를 반환하지만 나는 구분 기호로 토큰을 원한다. –

1

String#split()해야한다 분할 방법은 주위에 분할 정규 표현식의 일치

1

매우 큰 문자열을 처리해야하는 경우 자신의 코드를 롤백하는 것이 좋습니다. 자바 패턴 매칭 엔진은 좋은 범용 툴이지만, 종종 커스텀 코드에 의해 out-perform 될 수 있습니다.

핵심은 Apache Commons StringUtils 라이브러리와 같은 것을 사용하는 것입니다. 이것은 매우 사용하기 쉽고 표준 자바 어휘에서 빠져있는 수많은 함수를 가지고 있습니다.

기능 :

i = StringUtils.indexOfAny("A#B^C&D!ased&[email protected]%","[#^&[email protected]%]+"); 

는 당신에게 첫 번째 단락 문자의 인덱스를 얻을 것이다. 앞면을 새겨서 배열을 반복하는 것은 사용자의 몫입니다.