Java拆分保留delimeters、换行符和回车符
我正在使用apachecamel使用regex分割文件流。我需要保留delimeters,因此我使用以下正则表达式:Java拆分保留delimeters、换行符和回车符,java,regex,apache-camel,Java,Regex,Apache Camel,我正在使用apachecamel使用regex分割文件流。我需要保留delimeters,因此我使用以下正则表达式: (?=\r\n[0-9]{2}00)用于带回车符的windows换行符 但是,我希望同时支持Windows和Linux换行符,因此我认为类似的方法应该可以工作: (?=\r?\n[0-9]{2}00)甚至(?=(\r\n}\n)[0-9]{2}00) 但是出于某种原因,执行上面的任何一个选项都会给我一些带有空值的输出,因此当我需要运行一些子字符串时,它会中断,等等 我还测试了其他
(?=\r\n[0-9]{2}00)
用于带回车符的windows换行符
但是,我希望同时支持Windows和Linux换行符,因此我认为类似的方法应该可以工作:
(?=\r?\n[0-9]{2}00)
甚至(?=(\r\n}\n)[0-9]{2}00)
但是出于某种原因,执行上面的任何一个选项都会给我一些带有空值的输出,因此当我需要运行一些子字符串时,它会中断,等等
我还测试了其他选项,如:
(?=。\n[0-9]{2}00)
(?=^[0-9]{2}00)
(我将换行符保留在prev组上)
但对于其中任何一个,我在开始或结束时都会得到一个空输出
编辑:添加了骆驼路线
<route id="FileRoute" trace="false">
<from uri="file:{{file.path}}?move=.done&readLock=changed&readLockCheckInterval=1500&charset=UTF-8"/>
<split streaming="true" stopOnException="true" shareUnitOfWork="true" parallelProcessing="true">
<tokenize token="(?=\R[0-9]{2}00)" regex="true" />
<setHeader headerName="CamelSplitIndex">
<!-- line number basically -->
<simple>${property.CamelSplitIndex}</simple>
</setHeader>
<setHeader headerName="CamelSplitComplete">
<!-- did I read the last line? -->
<simple>${property.CamelSplitComplete}</simple>
</setHeader>
<log message="Line: ${property.CamelSplitIndex}: BODY: ${body}"/>
<choice>
<when>
<simple>${property.CamelSplitIndex} == 0</simple>
<!-- skip first line as its a header -->
</when>
<otherwise>
<setProperty propertyName="StringFound">
<simple>${body.substring(5,24).trim()}</simple>
</setProperty>
<setHeader headerName="ModifiedStringFound">
<simple>${property.StringFound}</simple>
</setHeader>
<process ref="ProcessName"/>
<transform>
<simple>${body.replace(${property.StringFound}, ${header.ModifiedStringFound})}</simple>
</transform>
<removeHeader headerName="ModifiedStringFound"/>
</otherwise>
</choice>
<aggregate strategyRef="AggregationStrategy" completionTimeout="15000">
<correlationExpression>
<simple>${in.header.CamelFileName}</simple>
</correlationExpression>
<completionTimeout>
<header>timeout</header>
</completionTimeout>
<to uri="log:com.blah.blah.out"/>
</aggregate>
</split>
</route>
知道如何解决这个问题吗?使用
“\\R”
(\R
)匹配任何换行符序列。@WiktorStribiżew同样的问题调用方法失败:由于:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:24
,代码出现了一些问题。@Fede。StringIndexOutOfBoundsException与此正则表达式无关。您能否提供额外的代码(包括可能的输入和预期的输出),其中使用这个正则表达式和子字符串来更好地理解您所遇到的问题的全貌?只需忽略前瞻中的\r
(?=\n[0-9]{2}00)
就行了吗?(结尾是多余的\r。)
78643756435694369 4754757864254578754578545457 0071
05007684546545465745 1740266981415800014580631000874120180521185558 000000000247986DFGBDFH FDGDGJHUHJK SDFGSGDFGf GT 541100898 00710047503051 0220180522
0501 000000 000000000000 046 00000103971056242218759000000000000 000000000000 000000 00000000000
0502 GH 001000000000000000000
05005212455451257521 1740266981415800001820031000874120180521183349 000000001817986FGHDFHFGJFGDHGDFDFH FDGFDHGFDHDFH 541100898 00710043090051 0220180522
0501 000000 000000000000 046 00000100293449142130526000000000000 000000000000 000000 00000000000
0502 FD 001000000000000000000
05009789265762578888 1740266981415800012612361003716920180521173412 000000004859986DFHDGJFGJFGJKHGJGHJ GDHFGHFGHFGH 541100898 00710029706451 0220180522
0501 000000 000000000000 046 00000103058175142271046000000000000 000000000000 000000 00000000000
0502 AR 001000000000000000000
05008758407825904958 1740266981415800004933011003716920180521173559 000000000798986FGHGFGHRTUJHGJDGHYHTJK DHDGJFHJHFHJ NJ 541100898 00710030461251 0220180522
0501 000000 000000000000 046 00000100902124678647109000000000000 000000000000 000000 00000000000
0502 TY 001000000000000000000
05004987785686893465 1740266981415800003253131003716920180521174415 000000001142986FDGFDGHFGJTYUJDFHGDEHGTGFH DFHDYRT BG 541100898 00710032033851 0220180522
0501 000000 000000000000 046 00000100620274678526079000000000000 000000000000 000000 00000000000
0502 UI 001000000000000000000