2016-10-25 9 views
0

Meine Scala App erhält eine Zeichenfolge, die das Token "flimFlam(*)" enthält oder nicht enthält, wobei das Sternchen jede Art von Text, Zeichen, Interpunktion usw. darstellt Nur 0 oder 1 Instanzen von "flimFlam(*)" in dieser Zeichenfolge, nie mehr.Extrahieren der inneren Gruppe mit Scala Regex

Ich muss feststellen, ob die angegebene Eingabezeichenfolge eine "flimFlam(*)" -Instanz enthält, und wenn dies der Fall ist, extrahieren Sie, was auch immer in den zwei Klammern ist. Wenn also meine Zeichenfolge „flimFlam(Joe)“, dann wäre das Ergebnis eine Zeichenfolge mit einem Wert von „Joe“ usw. sein

Mein bester Versuch so weit:

val inputStr : String = "blah blah flimFlam(Joe) blah blah" 

// Regex must be case-sensitive for "flimFlam" (not "FLIMFLAM", "flimflam", etc.) 
val flimFlamRegex = ".*flimFlam\\(.*?\\)".r 
val insideTheParens = flimFlamRegex.findFirstIn(inputStr) 

Kann jeder Stelle, wo ich m schief gehen?

Antwort

2

Verwenden Mustervergleich und regex Extraktor

val regex = ".*flimFlam\\((.*)\\).*".r 

inputStr match { 
case regex(x) => println(x) 
case _ => println("no match") 
} 

Scala REPL

scala> val inputStr : String = "blah blah flimFlam(Joe) blah blah" 
inputStr: String = blah blah flimFlam(Joe) blah blah 

scala> val regex = ".*flimFlam\\((.*)\\).*" 
regex: String = .*flimFlam\((.*)\).* 

scala> val regex = ".*flimFlam\\((.*)\\).*".r 
regex: scala.util.matching.Regex = .*flimFlam\((.*)\).* 

scala> inputStr match { case regex(x) => println(x); case _ => println("no match")} 
Joe 
+0

nicht verankert wie in anderen Antwort ist praktisch zu wissen (und zu fördern). –

0

Sie können eine Erfassungsgruppe um .*? verwenden und nur eine unanchored regex innerhalb match Block verwenden, so dass das Muster könnte bleib kurz und "hübsch" (keine Notwendigkeit für .* um den Wert, den Sie suchen):

var str = "blah blah flimFlam(Joe) blah blah" 
val pattern = """flimFlam\((.*?)\)""".r.unanchored 
val res = str match { 
    case pattern(res) => println(res) 
    case _ => "No match" 
} 

Siehe online demo

Beachten Sie auch, dass Sie nicht brauchen, um Schrägstriche innerhalb """ -quoted Stringliterale zu verdoppeln, die übermäßige Schrägstriche vermeiden hilft.

Und ein Hinweis: Wenn die flimFlam ein ganzes Wort ist, fügt \b vor - """\bflimFlam\((.*?)\)""".