2010-08-02 4 views
1

J'essaie d'utiliser Scanner pour décomposer une chaîne que j'ai lue à partir du fichier. données du fichier est:Comment utiliser le scanner pour rompre la chaîne

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:,,, 

Les étapes que je dois faire sont: longueur Obtenir de : 28-</n0:message> Prefix cette longueur avant: 28 et se débarrasser du reste

est là une expression régulière que je peux appeler pour obtenir un jeton de chaîne de: 28 à </n0:message>? Jusqu'ici j'ai un délimiteur pour obtenir le jeton de chaîne de: 28 mais je ne sais pas comment arrêter à </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...... 

Tout ce que je veux de mes données brutes est trois jetons:

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:,,, 

Répondre

1

Vous êtes sur la bonne voie; Il suffit d'utiliser un regard derrière pour le prochain delimiter:

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()); 
} 

Mais si vous avez déjà lu le texte dans une chaîne, il serait probablement plus facile l'utilisation Matcher.find() ou String.split(), ou même indexOf() et substring(). Je vais élaborer si vous êtes intéressé.

+0

Merci Alan, cela a fonctionné parfaitement. Pouvez-vous expliquer un peu plus loin le regard derrière et les expressions régulières? Je comprends le premier délimiteur, pas trop inclus: 28, ce qui me donne le premier jeton. Donc, pour la seconde, je ne comprends pas que reg exp ou le dernier. –

+0

En fait, je comprends le look derrière et \\ z ce qui signifie la fin de la chaîne, mais pourquoi puis-je utiliser? = Pour le premier délimiteur et? <= Pour la seconde? Merci, Shane. –

+0

Si vous utilisiez '(? =)' comme deuxième délimiteur, il correspondrait à la position * avant * le '', qui ferait partie du troisième jeton. Vous avez dit que vous vouliez qu'il reste dans le deuxième jeton, donc j'ai utilisé un lookbehind pour correspondre à la position juste * après * à la place. –

Questions connexes