在下面的代码段中,部分匹配得很好,但是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)
我不确定如何修复它。有什么建议吗?
答案 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
(只需在正则表达式的开头和结尾添加.*
,以匹配任何内容)