2016-09-29 5 views
0

私の最初の(今までの)Scala正規表現とここで苦労しています。与えられた文字列が正規表現と一致するかどうかを確認する必要があります: "animal<[a-zA-Z0-9]+,[a-zA-Z0-9]+>"。'matches' regexメソッドのスカラと同等ですか?

ので、いくつかの例:

animal<0,sega>   => valid 
animal<fizz,buzz>  => valid 
animAl<fizz,buzz>  => illegal; animAl contains upper-case (and this is case-sensitive) 
animal<fizz,3d>   => valid 
animal<,3d>    => illegal; there needs to be something [a-zA-Z0-9]+ between '<' and ',' 
animal<fizz,>   => illegal; there needs to be something [a-zA-Z0-9]+ between ',' and '>' 
animal<fizz,%>   => illegal; '%' doesn't match [a-zA-Z0-9]+ 
etc. 

これまでの私の最高の試み:私はレンガの壁にぶつかるよどこ

val animalRegex = "animal<[a-zA-Z0-9]+,[a-zA-Z0-9]+>".r 
animalRegex.findFirstIn("animal<fizz,buzz") 

は、残念ながら、それはです。 findFirstInanimalRegexの利用可能な他のすべての明白な方法は、すべてOption[String]タイプを返します。それは、価値ある

val animalRegex = "animal<[a-zA-Z0-9]+,[a-zA-Z0-9]+>".r 
if(animalRegex.matches("animal<fizz,buzz>")) { 
    val leftOperand : String = getLeftOperandSomehow(...) 
    val rightOperand : String = getRightOperandSomehow(...) 
} 

(だから私は、Javaのmatches方法と同等のものを必要とし、「左オペランド」にアクセスする方法が必要:私はブール値を返します何かを見つけることを期待していたので、のようなものは、最初の[a-zA-Z0-9]+グループの現在のケースでは "fizz")、次に右/ 2番目のオペランド( "buzz")の場合は同様です。私が間違っているアイデアは?

答えて

5

あなたの文字列からマッチした部分を抽出することができるようにするには、(括弧に注意してください)ので、同じように、あなたの正規表現式にキャプチャグループを追加する必要があります:

val animalRegex = "animal<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>".r 

その後、あなたはScalaのを使用することができます試合をチェックして、文字列からオペランドを抽出するために、パターンマッチング:

val str = "animal<fizz,3d>" 
val result = str match { 
    case animalRegex(op1,op2) => s"$op1, $op2" 
    case _     => "Did not match" 
} 

この例では、resultは美しい"fizz, 3d"

+0

何が含まれます答え。スカラードックは、文字列がパターンにマッチするかどうかを判断するために正規表現が使用されている場合は、マッチする部分を抽出または変換するために正規表現を使用します。慣用名は 'case animalRegex(_ *)=>'です。一致するかどうかだけをチェックし、グループは無視します。 –

関連する問題