2010-08-02 4 views
1

Scanner를 사용하여 파일에서 읽은 문자열을 분리하려고합니다. 파일 데이터는 다음과 같습니다Scanner를 사용하여 문자열 분리하는 방법

RFH ^@^@^@^B^@^@^@°^@^@^A^Q^@^@^D¸  
^@^@^@^@^@^@^D¸^@^@^@ 
<mcd><Msd>jms_bytes</Msd></mcd> 
^@^@^@d<jms><Dst>queue:///panddArchiveVerifyStep1.V001_I</Dst><Tms>1280138410102</Tms><Dlv>2</Dlv>< /jms> 571:8:*SYD01_P,31:*panddArchiveVerifyStep1.V001_I,520:454:28:panddArchiveVerifyStep1.V001,417:<?xml version="1.0" encoding="UTF-8"?> <n0:message xmlns:n0="uri:ebusiness.com"><n0:messageHeader><n0:messageType>panddArchiveVerify</n0:messageType><n0:messageVersion>001</n0:messageVersion></n0:messageHeader><n0:archiveDoc><n0:docImageID>14256448</n0:docImageID><n0:initialDispatchDatetime>2010-06-16T20:40:48.495</n0:initialDispatchDatetime><n0:processCount>0</n0:processCount></n0:archiveDoc></n0:message>,,4:cert,16:dummycertificate,4:algo,3:DES,3:sig,9:[[email protected],0:,,, 

내가해야 할 단계는 다음과 같습니다 에서 가져 오기 길이 : 28</n0:message> 접두사이 길이 이전에 : 나머지

제거 (28)와이 문자열 토큰을 얻기 위해 호출 할 수있는 정규 표현식 : 28에서 </n0:message>?

지금까지 문자열 토큰을 가져 오는 구분 기호가 있습니다. 그러나 나는 어떻게 멈추는 지 알지 못합니다. </n0:message>.

Scanner s = new Scanner(rawMsg.toString()).useDelimiter("(?=:28)");  
Example data 
:28:panddArchiveVerifyStep1.V001,417:<?xml version="1.0" encoding="UTF-8"?><n0:message xmlns:n0="uri:ebusiness.com...... 

난 내 원시 데이터에서 원하는 모든

세 토큰입니다 : 당신이 올바른 궤도에있어

Token One: 
RFH ^@^@^@^B^@^@^@°^@^@^A^Q^@^@^D¸  
^@^@^@^@^@^@^D¸^@^@^@ 
<mcd><Msd>jms_bytes</Msd></mcd> 
^@^@^@d<jms><Dst>queue:///panddArchiveVerifyStep1.V001_I</Dst><Tms>1280138410102</Tms><Dlv>2</Dlv>< /jms> 
571:8:*SYD01_P,31:*panddArchiveVerifyStep1.V001_I,520:454 

Token two: 
:28:panddArchiveVerifyStep1.V001,417:<?xml 
version="1.0" encoding="UTF-8"?> 
<n0:message 
xmlns:n0="uri:ebusiness.asic.gov.au"><n0:messageHeader><n0:messageType>panddArchiveVerify</n0:messageType><n0:messageVersion>001</n0:messageVersion></n0:messageHeader><n0:archiveDoc>< 
n0:docImageID>14256448</n0:docImageID><n0:initialDispatchDatetime>2010-06-16T20:40:48.495</n0:initialDispatchDatetime><n0:processCount>0</n0:processCount></n0:archiveDoc></n0:message> 

Token three: 
,,4:cert,16: 
dummycertificate,4:algo,3:DES,3:sig,9:[[email protected],0:,,, 

답변

1

;

if (sc.useDelimiter("(?=:28)").hasNext()) 
{ 
    System.out.printf("%n%s%n", sc.next()); 
} 
if (sc.useDelimiter("(?<=</n0:message>)").hasNext()) 
{ 
    System.out.printf("%n%s%n", sc.next()); 
} 
if (sc.useDelimiter("\\z").hasNext()) 
{ 
    System.out.printf("%n%s%n", sc.next()); 
} 

을하지만 당신은 이미 문자열에 텍스트를 읽은 경우, 아마 쉽게 사용 Matcher.find() 또는 String.split(), 또는 indexOf()substring() 것 : 그냥 다음 구분에 대한 뒤에 모습을 를 사용합니다. 네가 관심이 있다면 내가 정교 할거야.

+0

감사합니다. Alan, 완벽하게 작동했습니다. 뒤에있는 표정과 정규 표현식에 대해 좀 더 설명 할 수 있습니까? 첫 번째 구분 기호를 이해합니다. 28도 포함되지 않으므로 첫 번째 구분 기호가됩니다. 그래서 두 번째로, 나는 regexp 또는 마지막 것을 이해하지 못한다. –

+0

사실 나는 뒤에 보이는 모양을 이해하고 \\ z는 문자열의 끝을 의미하지만 왜 내가 사용합니까? = 첫 번째 구분 기호와? <= 두 번째? 감사합니다. 쉐인. –

+0

두 번째 구분 기호로'(? =)'을 사용하면 세 번째 토큰의 일부가 될' '앞에 * 위치와 일치합니다. 두 번째 토큰에 머무르기를 원한다고 했으므로 대신에 * 뒤에 위치를 일치시키는 데 사용했습니다. –

관련 문제