Mule中的Validator.matchesRegex以基本模式

时间:2016-04-20 16:02:41

标签: regex mule mule-el

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

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

但是当我将此正则表达式提供给Mule Expression语言中的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])$ ​​

  2. 但是我得到了同样的错误但是关闭了几个字符:

    [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. 取消数字之间的破折号

      &#39; ^ [0-9] {{4}} - (θ0 [1-9] | 1 [012]) - (0 [1-9] | [12] [0-9 ] | 3 [01])$ ​​

    2. 但是我收到以下错误:

      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] )$ 我已经取代了&#39; - &#39;用&#39;。&#39;这不是我想要的,但它至少验证了数字部分。我已经证实了这项工作。它只允许无效的值,例如&#39; 2016!02_23&#39;当它真的应该只允许&#39; 2016-02-23&#39;

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

1 个答案:

答案 0 :(得分:0)

骡子(如this page所示)并没有办法避免邪恶的逃脱。如果您在正则表达式中使用\,则必须将其撤消:\\。 Java也是一样。

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

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

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

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