2017-07-17 6 views
0

Ive wordenRegex verwenden hitEnd in scala

String[] ss = { "aabb", "aa", "cc", "aac" }; 
    Pattern p = Pattern.compile("aabb"); 
    Matcher m = p.matcher(""); 

    for (String s : ss) { 
     m.reset(s); 
     if (m.matches()) { 
     System.out.printf("%-4s : match%n", s); 
     } 
     else if (m.hitEnd()) { 
     System.out.printf("%-4s : partial match%n", s); 
     } 
     else { 
     System.out.printf("%-4s : no match%n", s); 
     } 
    } 

dieses Beispiel für die partielle matcing beobachten Und ich verwenden möchte, die hitEnd für meine scala Muster regex passend

val VERSION = "([0-2].0)" 
    val MESSAGE = s"A message with version $VERSION".r 

    def checkMessage(action: String): Boolean = { 
    action match { 
     case MESSAGE(version) => true 
     case _ => false 
    } 
    } 

Was ich will, ist das, wenn jemand A message with version 3.0 sagt ihm sagen, dass die Nachricht eine teilweise Übereinstimmung hat, aber die Version, die er Typ war nicht korrekt.

Irgendeine Idee, wie man dieses hitEnd in scala benutzt?

Grüße

Antwort

1

Es ist möglich, eine Matcher von einer Scala zusammengestellt regex zu bekommen, aber ich glaube nicht, es wird tun, was Sie wollen. Die Zeichenfolge "version" ist eine teilweise Übereinstimmung für das Muster version [0-2].0, aber die Zeichenfolge "version 3.0" ist nicht.

val m = "version ([0-2].0)".r.pattern.matcher("") 

for (s <- Seq("version 1.0", "v", "version ", "version 3.0")) { 
    m.reset(s) 
    if (m.matches)  println(f"$s%-11s : match") 
    else if (m.hitEnd) println(f"$s%-11s : partial match") 
    else    println(f"$s%-11s : no match") 
} 

Ausgang:

version 1.0 : match 
v   : partial match 
version  : partial match 
version 3.0 : no match 

Ein anderer Ansatz ist, zwei Muster zu erstellen, einen für den allgemeinen Fall und einen für das spezifische Ziel.

val prefix = "A message with version " 
val goodVer = (prefix + "([0-2].0)").r 
val someVer = (prefix + "(.*)").r 

def getVer(str: String): String = str match { 
    case goodVer(v) => s"good: $v" 
    case someVer(v) => s"wrong: $v" 
    case _   => "bad string" 
} 

getVer("A message with version 2.0") //res0: String = good: 2.0 
getVer("A message with version 3.0") //res1: String = wrong: 3.0 
getVer("A message with version:2.0") //res2: String = bad string