Как использовать сканер, чтобы разбить строку - PullRequest
1 голос
/ 02 августа 2010

Я пытаюсь использовать сканер, чтобы разбить строку, которую я прочитал из файла. Данные файла:

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:[B@7b3082,0:,,,

Шаги, которые мне нужно сделать: Получить длину от : 28 до </n0:message> Префикс этой длины до: 28 и избавиться от остальных

есть ли регулярное выражение, которое я могу вызвать, чтобы получить строковый токен: от 28 до </n0:message>?

Пока у меня есть разделитель для получения строкового токена: 28, но я не знаю, как остановиться на </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:[B@7b3082,0:,,,

1 Ответ

1 голос
/ 02 августа 2010

Вы на правильном пути; Просто используйте взгляд позади для следующего разделителя:

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(). Я уточню, если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...