2016-10-03 2 views
0

正規表現の質問があります。ここではURLからIDをつかむために正規表現だ - 大文字小文字を区別しない:このキャプチャグループを取得しようとすると、なぜMatchErrorが発生しますか?

scala> val idRegex = """(?i)images\/(.*)\.jpg""".r 
idRegex: scala.util.matching.Regex = (?i)images\/(.*)\.jpg 

それは私の主題に一致します。

scala> val slidephotoId = idRegex.findFirstIn("/xml/deliverables/images/23044.jpg") 
slidephotoId: Option[String] = Some(images/23044.jpg) 

しかし、私は試合のエラーを取得する抽出としてそれを使用します。

scala> val idRegex(id) = "/xml/deliverables/images/23044.jpg" 
scala.MatchError:/xml/deliverables/images/23044.jpg (of class java.lang.String) 
    ... 43 elided 

私は何が間違っていますか? Scalaでは

答えて

2

正規表現は(意味 - 彼らは全体の入力と一致する必要があります) - デフォルトでに固定されているあなたは、あなたの正規表現は、非固定にする場合 - これは動作します:

scala> val idRegex = """(?i)images\/(.*)\.jpg""".r.unanchored 
idRegex: scala.util.matching.UnanchoredRegex = (?i)images\/(.*)\.jpg 

scala> val idRegex(id) = "/xml/deliverables/images/23044.jpg" 
id: String = 23044 

別のオプションを、当然のことながら、ありますそれは全体の入力、例えば占めように正規表現を変更するには:findFirstIn方法として

scala> val idRegex = """(?i).+images\/(.*)\.jpg""".r 
idRegex: scala.util.matching.Regex = (?i).+images\/(.*)\.jpg 

scala> val idRegex(id) = "/xml/deliverables/images/23044.jpg" 
id: String = 23044 

- 明らかにそれは正規表現があることにかかわらず、正しい結果を返します。チョーであってもいなくてもかまいません - 定義上、入力をスキャンして一致を探し、入力全体が一致する必要はありません。

関連する問題