20

我想用这个

val r = """^myprefix:(.*)""".r
val r(suffix) = line
println(suffix)

但是当字符串不匹配时会出错。如何在匹配是可选的情况下使用类似的构造?

编辑:为了清楚起见,我需要该组(.*)

4

3 回答 3

39

您可以通过模式匹配提取匹配组。

val r = """^myprefix:(.*)""".r
line match {
  case r(group) => group
  case _ => ""
}

另一种使用方式Option

Option(line) collect { case r(group) => group }
于 2012-08-04T18:05:58.110 回答
27
"""^myprefix:(.*)""".r        // Regex
  .findFirstMatchIn(line)     // Option[Match]
  .map(_ group 1)             // Option[String]

这样做的好处是您可以将其编写为单行,而无需将正则表达式分配给中间值r

如果您想知道,组 0 是匹配的字符串,而组 1 等是捕获组。

于 2012-08-05T01:51:33.693 回答
2

尝试

r.findFirstIn(line)

升级版:

scala> val rgx = """^myprefix:(.*)""".r
rgx: scala.util.matching.Regex = ^myprefix:(.*)

scala> val line = "myprefix:value"
line: java.lang.String = myprefix:value

scala> for (rgx(group) <- rgx.findFirstIn(line)) yield group
res0: Option[String] = Some(value)
于 2012-08-04T17:48:45.357 回答