代码之家  ›  专栏  ›  技术社区  ›  shane lee

如何使用扫描器分解字符串

  •  1
  • shane lee  · 技术社区  · 15 年前

    我试图用扫描器来分解从文件中读取的字符串。

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

    我需要做的步骤是: 从中获取长度 </n0:message>

    我是否可以调用正则表达式来获取字符串标记从:28到 < ?

    到目前为止,我有一个分隔符来获取字符串标记:28,但我不知道如何停止在 < .

    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 回复  |  直到 15 年前
        1
  •  1
  •   Alan Moore Chris Ballance    15 年前

    你在正确的轨道上;看看就知道了 对于下一个分隔符:

    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() . 如果你有兴趣,我会详细说明的。