1

Scala正規表現は、次の2つの条件のいずれかでうまく機能します。
無条件に実行されるコード:例:

val lineregx = """([\w]+)\t([/\w.+-]+)\t([/\w+=\-!%# ]+)""".r
val anotherregx = """([\w]+)\t([/\w+=\-!%# ]+)""".r
val lineregx(category, aaUrl, title) 

または、caseステートメント内で式を使用する場合(そしてそれらを再度必要としない場合)。

val lineregx = """([\w]+)\t([/\w.+-]+)\t([/\w+=\-!%# ]+)""".r
line match {

case lineregx(category, aaUrl, title) => // do something with category, aaUrl and title in here!
case anotherRegx(category, aaUrl) => // do something different with category, aaUrl and title in here!
case _ => { println("did not match line %s".format(line)); return 0 }

}

しかし、caseステートメントの外部の変数への一致を「表面化」する必要がある場合はどうでしょうか?具体的には、以下に示す変数は、

val lineregx = """([\w]+)\t([/\w.+-]+)\t([/\w+=\-!%# ]+)""".r
var category = "" ; var aaUrl = "";var title = ""
line match {
case lineregx(category, aaUrl, title) => val lineregx(category, aaUrl, title) = line
case anotherRegx(category, aaUrl) => val lineregx(category, aaUrl) = line
case _ => { println("did not match line %s".format(line)); return 0 }
}
// Do something with category, aaUrl, title HERE after the case statement.

問題は、lineregx / anotherregexを適用するための構文により、これらの変数がcaseステートメントに対してのみローカルになることです。

4

2 に答える 2

3

Roughly,

val lineregx = """([\w]+)\t([/\w.+-]+)\t([/\w+=\-!%# ]+)""".r
val (category, aaUrl, title) = line match {
  case lineregx(category, aaUrl, title) => (category, aaUrl, title)
  case anotherRegx(category, aaUrl) => (category, aaUrl, ???)
  case _ => { println("did not match line %s".format(line)); return 0 }
}
// Do something with category, aaUrl, title HERE after the case statement.

But that code is quite disorganized. For one thing, there's the question of the value of title for the second case. For another, there's the early return. Instead, the code would probably be best organized like this:

// method declaration
// ...
  val lineregx = """([\w]+)\t([/\w.+-]+)\t([/\w+=\-!%# ]+)""".r
  line match {
    case lineregx(category, aaUrl, title) => f(category, aaUrl, title)
    case anotherRegx(category, aaUrl)     => f(category, aaUrl, ???)
    case _ => 
      println("did not match line %s".format(line))
      0
  }
}  // end of method

def f(category: String, aaUrl: String, title: String): Int = {
  // Do something with category, aaUrl, title HERE
}
于 2013-01-22T04:15:06.123 に答える
2

あなたが使用することができますOption

val lineregx = """([\w]+)\t([/\w.+-]+)\t([/\w+=\-!%# ]+)""".r

val (maybeCat, maybeUrl, maybeTitle) = 
line match {
  case lineregx(category, aaUrl, title) => (Some(category), Some(aaUrl), Some(title))
  case anotherRegx(category, aaUrl)     => (Some(category), Some(aaUrl), None)
  case _ => 
    println("did not match line %s".format(line))
    (None, None, None)
}

var category = maybeCat getOrElse ""
var aaUrl =    maybeURL getOrElse ""
var title =    maybeTitle getOrElse  ""

もう少し冗長ですが、この方法で同じスコープ内の変数を取得できます。

于 2013-01-22T05:17:45.727 に答える