java - 如何使用扫描仪分解字符串

标签 java regex

我正在尝试使用扫描仪来分解我从文件中读取的字符串。 文件数据为:

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

最佳答案

你走在正确的道路上;只需使用后面作为下一个分隔符即可:

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() 可能会更容易。如果您有兴趣,我会详细说明。

关于java - 如何使用扫描仪分解字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384893/

相关文章:

java - 既然作者已经写了ProxyConnection,为什么要通过javaassist生成HikariProxyConnection呢?

java - 通过 Oracle 的 Unix 命令

Java:来自流源的top-n元素

java - 使用 NIO(解)压缩文件

java - 如何获取系统语言?

javascript - 验证在 JavaScript 中设置为 JSON 的电子邮件扩展列表

Python 正则表达式提取第一个大写单词或第一个和第二个单词(如果两者都大写)

正则表达式组选择

regex - Ant 正则表达式(regexp 元素)模式中的转义字符是什么

python - 从日志文件中提取唯一访问者列表