在以下代码中,相同的模式在使用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")
}
}
Run Code Online (Sandbox Code Playgroud)
应用输出是:
Java匹配abcde
Scala unapplySeq无
Scala findFirstIn Some(/oAuth.html?state=abcde)
Scala不匹配
什么导致Scala正则表达式unapplySeq失败?
定义Scala模式时,默认情况下会锚定它(=需要完整的字符串匹配),而Java sj.find()正在字符串中的任何位置查找匹配项.添加.unanchoredScala正则表达式也允许部分匹配:
val statePattern = statePatternString.r.unanchored
^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
请参阅IDEONE演示
def unanchored: UnanchoredRegex使用相同的模式创建一个新的Regex,但不要求整个String在提取器模式中匹配.
通常情况下,日期匹配的行为就好像模式被锚定在锚点中一样
^pattern$.未锚定的正则表达式就好像这些锚被移除了一样.
请注意,此方法实际上不会从模式中剥离任何匹配器.
替代解决方案意味着.*在模式结束处添加,但请记住,默认情况下,点与新行不匹配.如果解决方案应该是通用的,(?s)则应在模式的开头指定DOTALL修饰符,以确保匹配具有潜在换行序列的整个字符串.
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |