【发布时间】:2019-11-01 02:56:36
【问题描述】:
在下面的代码中,当使用 Java API 时,相同的模式匹配,但在使用 Scala 模式匹配时不匹配。
import java.util.regex.Pattern
object Main extends App {
val text = "/oAuth.html?state=abcde&code=hfjksdhfrufhjjfkdjfkds"
val statePatternString = """\/.*\?.*state=([^&\?]*)"""
val statePattern = statePatternString.r
val statePatternJ = Pattern.compile(statePatternString)
val sj = statePatternJ.matcher(text)
val sjMatch = if (sj.find()) sj.group(1) else ""
println(s"Java match $sjMatch")
val ss = statePattern.unapplySeq(text)
println(s"Scala unapplySeq $ss")
val sm = statePattern.findFirstIn(text)
println(s"Scala findFirstIn $sm")
text match {
case statePattern(s) =>
println(s"Scala matching $s")
case _ =>
println("Scala not matching")
}
}
应用输出是:
Java 匹配 abcde
Scala unapplySeq 无
Scala findFirstIn Some(/oAuth.html?state=abcde)
Scala 不匹配
使用提取器语法val statePattern(se) = text 时,错误为scala.MatchError。
是什么导致 Scala 正则表达式 unapplySeq 失败?
【问题讨论】:
-
你能解释一下你想匹配什么吗?
-
如果问题和/或接受的答案可以在内容的某处包含“MatchError”,这将很有帮助。对 Java 的引用与对发生这种情况时生成的
scala.MatchError异常的引用相结合,使得当来自仅 Scala 的上下文时很难搜索到该条目。这是我因未能找到它而最终产生的问题。 stackoverflow.com/q/66392638/501113