我正在尝试提出一个 Camel 路由,其中只有与给定的正则表达式匹配的消息才会被发送到 jms 队列..
我的路线是这样的:
<route id="testRoute">
<from uri="jms:queue:Q.Order1" />
<choice>
<when>
<simple>${body} regex '\w+.*'</simple>
<to uri="jms:queue:Q.Order2"/>
</when>
</choice>
</route>
如果我的消息。是这样的,它很好地通过了正则表达式:
000000010020140507
但是,如果我的消息是这样的,它就会失败:
00000001002 REXRYAN 004
00000002076006490993999900000
为什么第二条消息无法通过正则表达式,需要修改正则表达式中的哪些内容才能传递第二条消息? 谢谢
最佳答案
在正则表达式中,.
默认情况下不匹配大多数语言中的换行符。在您的情况下,您有一个多行字符串,因此正文与正则表达式 \w+.*
不匹配,因为只有第一行匹配。
通常有两种方法可以绕过这个问题:
使用修饰符/标志,使
.
也匹配换行符(但我不知道 Camel,所以我不确定如何做到这一点,尽管添加(?s)
在正则表达式的开头可能会使这项工作同样有效,因为这相当于设置特定的修饰符/标志。使用包含字符及其否定的类。
例如,
[\s\S]
包含\s
(包含换行符的空白字符)和\S
匹配非空白字符。它们一起将匹配所有内容,因为\S
将匹配\s
不匹配的所有内容。您也可以使用
[\w\W]
来给出相同的结果,或者使用[\d\D]
或类似的结构。
关于java - Camel 中的正则表达式匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23550743/