Scala正则表达式模式匹配问题

时间:2014-05-02 20:19:04

标签: regex scala

在下面的代码段中,部分匹配得很好,但是part2无法匹配。

val part = """TEXT:123:4:5"""
val part2 = """ text="TEXT:123:4:1">"""
val regex = """TEXT:(\d+):(\d+):(\d+)""".r

def matchAndPrint(text: String) {
  println(text match {
    case regex(num1, num2, num3) => s"$num1:$num2:$num3"
    case _ => "no match"
  })
}
matchAndPrint(part)
matchAndPrint(part2)

我不确定如何修复它。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

这就是unanchored的用途,如here所示。

scala> val part = """TEXT:123:4:5"""
part: String = TEXT:123:4:5

scala> val part2 = """ text="TEXT:123:4:1">"""
part2: String = " text="TEXT:123:4:1">"

scala> val regex = """TEXT:(\d+):(\d+):(\d+)""".r.unanchored
regex: scala.util.matching.UnanchoredRegex = TEXT:(\d+):(\d+):(\d+)

scala> def matchAndPrint(text: String) {
     |   println(text match {
     |     case regex(num1, num2, num3) => s"$num1:$num2:$num3"
     |     case _ => "no match"
     |   })
     | }
matchAndPrint: (text: String)Unit

scala> matchAndPrint(part)
123:4:5

scala> matchAndPrint(part2)
123:4:1

抱歉,我找不到规范的Q& A。它出现了好几次。

答案 1 :(得分:1)

正则表达式匹配要求它与完整字符串匹配,因此part2中相关部分之前和之后的文本会导致问题。

试试这个:

val regex = """.*TEXT:(\d+):(\d+):(\d+).*""".r

""" text="TEXT:123:4:1">""" match {
  case regex(num1, num2, num3) => s"$num1:$num2:$num3"
}

// res0: String = 123:4:1

答案 2 :(得分:0)

您正在尝试完全匹配。

因此,您需要在part2的开头和结尾添加字符,例如:

val regex = """.*TEXT:(\d+):(\d+):(\d+).*""".r

(只需在正则表达式的开头和结尾添加.*,以匹配任何内容)