【问题标题】:Regex expression matcher in CamelCamel中的正则表达式匹配器
【发布时间】:2014-06-26 08:59:57
【问题描述】:

我正在尝试提出一个骆驼路线,只有当它匹配给定的正则表达式时,才会将消息发送到 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

为什么第二条消息未能通过正则表达式以及需要在正则表达式中修改什么以传递第二条消息? 谢谢

【问题讨论】:

  • 尝试在正则表达式中使用[\s\S] 而不是.
  • 将正则表达式更改为 '\w+\s\S*'....但没有用。
  • @user1717230 你没有使用方括号?
  • '\w+[\s\S]*' 工作......如果你不介意......你能解释一下发生了什么......请......

标签: java regex jms apache-camel activemq


【解决方案1】:

在正则表达式中,. 默认不匹配大多数语言中的换行符。在您的情况下,您有一个多行字符串,因此正文与正则表达式 \w+.* 不匹配,因为只有第一行匹配。

通常有两种方法可以绕过这个:

  1. 使用修饰符/标志,使 . 也匹配换行符(但我不知道 Camel,所以我不确定如何执行此操作,尽管在开头添加了 (?s)正则表达式可能会使这项工作同样有效,因为这相当于设置特定的修饰符/标志)。

  2. 使用一个同时包含一个字符及其否定的类。

    例如,[\s\S] 包含 \s(包含换行符的空白字符)和匹配非空白字符的 \S。它们一起将匹配所有内容,因为\S 将匹配所有\s 不匹配的内容。

    您也可以使用[\w\W] 来给出相同的结果,或者使用[\d\D] 或类似的构造。

【讨论】:

  • 我知道答案是正确的。 +1'ed。 :)
  • 如果有超过 2 行,这是否也有效...?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2011-01-24
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多