2016-10-25 9 views
0

My Scalaアプリには、その中にトークン「flimFlam(*)」が含まれていてもいなくてもよい文字列が与えられています。アスタリスクはあらゆる種類のテキスト、文字、句読点などを表します。この文字列には "flimFlam(*)"の0または1のインスタンスしか存在しません。Scalaの正規表現を使用した内部グループの抽出

与えられた入力文字列に "flimFlam(*)"インスタンスが含まれているかどうかを検出し、そうであれば、2つのかっこの中にあるものを抽出する必要があります。私は「

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) 

でき、誰のスポット:私の文字列が含まれている場合はそれゆえ、「flimFlam(Joe)」は、結果は「Joe」の値を持つ文字列など、これまで

私の最高の試みになります私は間違っていますか?

答えて

2

使用パターンマッチングと正規表現抽出

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

他の回答と同じようにアンパンマンが知っている(と促進する)に便利です。 –

0

あなたは.*?周りのキャプチャグループを使用して、ちょうどパターンができるようにmatchブロック内でアンカーされない正規表現を使用することができます短いと "かなり"(あなたが探している価値の周りに.*の必要性はない):

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

は、あなたが過度のバックスラッシュを避けることができます""" -quoted文字列リテラル内のバックスラッシュを二重にする必要はありませんのでご注意、またonline demo

を参照してください。

そしてヒント:flimFlam単語全体であれば、前に\bを追加 - """\bflimFlam\((.*?)\)"""

関連する問題