【问题标题】:Validator.matchesRegex in Mule blows up with basic patternMule 中的 Validator.matchesRegex 因基本模式而崩溃
【发布时间】:2016-04-22 00:01:35
【问题描述】:

我收到消息中的日期作为字符串。以下正则表达式将确认它至少是我知道我可以处理的格式:

^[0-9]{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])$

但是当我将这个正则表达式提供给 Mule 表达式语言中的 validator.matchesRegex 方法时,如下所示:

<when expression="#[validator.matchesRegex(payload.DateOfBirth,'^[0-9]{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])$') == false]">
    <set-variable variableName="validation_message" value="{&quot;error&quot;: &quot;Invalid DateOfBirth&quot;}" doc:name="invalid DateOfBirth"/>
</when>

我收到以下错误:

org.mule.api.MessagingException: [Error: illegal escape sequence: -]
[Near : {... eOfBirth,'^[0-9]{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[1 ....}]
                                                                  ^
[Line: 1, Column: 55] (org.mule.api.expression.InvalidExpressionException). Message payload is of type: HashMap

更新 我尝试了两个新的改动:

  1. 像这样把我的大括号加倍:

    ^[0-9]{{4}}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[ 01])$

但我得到了同样的错误,但有几个字符:

[Error: illegal escape sequence: -]
[Near : {... fBirth,'^[0-9]{{4}}\-(0?[1-9]|1[012])\-(0?[1-9]|[1 ....}]
                                                                    ^
[Line: 1, Column: 57] (org.mule.api.expression.InvalidExpressionException). Message payload is of type: HashMap
  1. 取消数字之间的破折号

    '^[0-9]{{4}}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3 [01])$

但我收到以下错误:

org.mule.api.MessagingException: Execution of the expression "validator.matchesRegex(payload.DateOfBirth,'^[0-9]{{4}}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$') == false" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: HashMap
  1. 我已将模式更改为不使用转义反斜杠来仅接受破折号:

    ^[0-9]{4}.(0?[1-9]|1[012]).(0?[1-9]|[12][0-9]|3[01] )$ 我已将 '-' 替换为 '.'这不是我真正想要的,但它至少验证了数字部分。我已经确认这有效。它只允许无效值,例如“2016!02_23”,而实际上应该只允许“2016-02-23”

TL;DR:当您尝试转义短划线字符时,MEL 中的正则表达式存在错误?

【问题讨论】:

  • 我认为你不应该逃避连字符。
  • 另外,问题可能出在{}。尝试在你的模式中将它们加倍。
  • 谢谢,我两个都试试!
  • 两个都试过了,又出错了。还有其他想法吗?
  • 显示文档中的一些示例。 payload 可能是一个哈希映射。试过payload['DateOfBirth']

标签: regex mule mule-el


【解决方案1】:

骡子(正如this page 所指出的那样)没有办法避免邪恶的逃脱。如果您在正则表达式中使用\,则必须对其进行转义:\\。 Java 也是如此。

此外,您需要了解某些正则表达式符号并不总是需要转义。当您在 Mule/Java 中工作时,这一点非常重要,因为这意味着您避免了邪恶的逃脱。

根据它们在正则表达式中出现的位置,字符可能会获得或失去作为元字符的意义。 - 字符只有在夹在[] 字符类中时才具有特殊含义。这意味着您可以正常使用它,而不是在正则表达式中转义它。

我建议你阅读正则表达式。

有时您需要使用邪恶的逃生逃生,这可能会让人感到困惑。就个人而言,我通常使用this site 将我的正则表达式转换为转义的Strings。

【讨论】:

  • 我尝试使用双反斜杠,但随后出现 MEL 表达式异常。我会将其添加到问题更改中。
  • 你是对的,我不需要斜杠上的反斜杠。我现在就试试看它是否有效!谢谢@Laurel
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2013-03-09
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多