2016-04-20 9 views
1

Ich erhalte ein Datum in der Nachricht als Zeichenfolge. Der folgende reguläre Ausdruck wird bestätigen, es zumindest in dem Format, das ich weiß, dass ich umgehen kann:Validator.matchesRegex in Mule explodiert mit Grundmuster

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

aber wenn ich bieten diese regex auf die validator.matchesRegex Methode in der Mule Expression Sprache wie so:

<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> 

ich erhalte den folgenden Fehler:

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 

Update ich zwei neue a versucht haben, lterations:

  1. Verdoppelung meine geschweiften Klammern nach oben wie so:

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

$, aber ich den gleichen Fehler, aber ein paar Zeichen aus:

[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. unescaping die Bindestriche zwischen den Zahlen

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

aber ich bekomme die folgende Fehlermeldung:

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. ich habe das Muster verändert nicht die Verwendung Escape-Backslash, um nur den Bindestrich zu akzeptieren:

    ^[0-9] {4}. (0? [1-9] | 1 [012]). (0? [1-9] | [12] [ 0-9] | 3 [01]) $ Ich habe '-' durch 'ersetzt.' das ist nicht wirklich was ich will, aber es validiert zumindest die Anzahl Portionen. Ich habe bestätigt, dass das funktioniert. es erlaubt nur ungültige Werte wie ‚2016 02_23!‘, wenn es wirklich nur ‚2016.02.23‘

TL erlauben sollte; DR: gibt es einen Fehler mit regulären Ausdrücken innerhalb MEL, wenn Sie sind versuchen, dem Dash-Charakter zu entkommen?

+0

Ich denke, Sie sollten nicht die Bindestriche entkommen. –

+0

Das Problem kann auch mit '{}' sein. Versuchen Sie, sie in Ihrem Muster zu verdoppeln. –

+0

danke, ich werde beides versuchen! –

Antwort

0

Mule (wie this page angibt) gibt keinen Weg, um die bösen Flucht entkommen zu vermeiden. Wenn Sie einen \ in Ihrer Regex verwenden, müssen Sie es entkommen: \\. Java ist der gleiche Weg.

Außerdem müssen Sie verstehen, dass bestimmte Regex-Symbole nicht immer maskiert werden müssen. Dies ist sehr wichtig, wenn Sie in Mule/Java arbeiten, denn das bedeutet, dass Sie die entflohene Flucht vermeiden.

Je nachdem, wo sie in der Regex erscheinen, können Zeichen als Meta-Zeichen Bedeutung gewinnen oder verlieren. Das Zeichen hat nur dann eine besondere Bedeutung, wenn es innerhalb der Zeichenklassen [] liegt. Dies bedeutet, dass Sie es einfach normal verwenden können, anstatt es in Ihrem regulären Ausdruck zu umgehen.

Ich schlage vor, dass Sie auf Regexes nachlesen.

Es wird Zeiten geben, in denen Sie die evil escape verwenden müssen, die verwirrend sein kann. Persönlich verwende ich normalerweise this site, um meine Regexes in maskierte String s zu konvertieren.

+0

Ich habe versucht, den doppelten Backslash, aber dann bekomme ich eine MEL-Ausdruck Ausnahme. Ich werde es den Frageänderungen hinzufügen. –

+0

Sie haben Recht, ich brauche die Backslashes nicht auf den Schrägstrichen. Ich werde das jetzt versuchen und sehen, ob es funktioniert! Danke @Laurel –