2016-05-18 2 views
0

Ich muss alle Übereinstimmungen in einer Zeichenfolge finden, die vordefinierte Token (AB- oder BCC- oder CDD-) oder enthält [AZ] {2,4} -. Vordefinierte Token haben die höchste Priorität. ich meine:Scala Regexp: finde alle Übereinstimmungen in einer Zeichenfolge, die vordefinierte Token oder ein Wort mit 2 bis 4 Zeichen enthalten

regex.findAllIn("XBCC-").toList muss immer wieder zurückkehren List (bcc-), nicht List (XBCC-)

aber:

regex.findAllIn("XTEST-").toList muss zurückkehren List (TEST-)

Ich versuche, so etwas wie dass:

val regex = "((AB|BCC|CDD)|[A-Z]{2,4})-".r 

Aber es funktioniert nicht richtig

+0

Sie sollten in zwei Schritten tun. Überprüfen Sie zunächst mit den vordefinierten Werten und verwenden Sie dann den generischen Wert. –

+0

Ist es unmöglich in einem regulären Ausdruck zu tun? – user2621486

+0

Nein, das ist mit Scala regex nicht möglich. Siehe [einige Erklärungen hier] (http://stackoverflow.com/questions/35606426/order-of-regular-expression-operator/35606463#35606463), und hier ist eine [verwandte Antwort] (http://stackoverflow.com)/questions/35944441/lazy-quantifier-nicht-arbeiten-wie-ich-würde erwarten/35944635 # 35944635) zeigen, wie Regex-Engine funktioniert. Das ganze Problem ist, dass Ihr Ausdruck nicht links verankert ist und die Engine mit jedem alternativen Zweig an jedem Ort beginnen kann. –

Antwort

0

Glauben Sie den Neinsagern nicht. Dies kann sehr leicht mit regex erfolgen:

(?!\w+(?:AB|BCC|CDD)-)[A-Z]{2,4}- 

die demo See.

Die Lookahead-Assertion stellt sicher, dass das Muster nicht übereinstimmt, wenn AB-, oder CDD- später im Text vorhanden ist.


Erläuterung:

(?!    assert that there is no... 
    \w+    ...sequence of characters... 
    (?:AB|BCC|CDD) ...followed by AB, BCC, or CDD... 
    -    ...and a dash 
) 
[A-Z]{2,4}-  then simply match 2 to 4 characters before a dash 
Verwandte Themen