我发现通过Scala中正则表达式上的模式匹配提取的组与使用findAllIn函数提取的组不同。
1)以下是使用模式匹配的提取示例 -
scala> val fullRegex = """(.+?)=(.+?)""".r
fullRegex: scala.util.matching.Regex = (.+?)=(.+?)
scala> val x = """a='b'"""
x: String = a='b'
scala> x match { case fullRegex(l,r) => println( l ); println(r) }
a
'b'
2)以下是使用findAllIn函数提取的示例 -
scala> fullRegex.findAllIn(x).toArray
res4: Array[String] = Array(a=')
我期待使用findAllIn返回的数组是数组(a,' b')。 为什么不是这样?
答案 0 :(得分:1)
这是因为你没有指定第二个懒惰匹配的程度。所以在=
之后它只消耗一个字符,并在懒惰模式下停止。
见这里。
https://regex101.com/r/dU7oN5/10
将其更改为.+?=.+
以获取完整数组
答案 1 :(得分:0)
特别是,模式匹配使用unapplySeq
使用Matcher.matches
,而findAllIn
使用Matcher.find
。 matches
尝试匹配整个输入。
scala> import java.util.regex._
import java.util.regex._
scala> val p = Pattern compile ".+?"
p: java.util.regex.Pattern = .+?
scala> val m = p matcher "hello"
m: java.util.regex.Matcher = java.util.regex.Matcher[pattern=.+? region=0,5 lastmatch=]
scala> m.matches
res0: Boolean = true
scala> m.group
res1: String = hello
scala> m.reset
res2: java.util.regex.Matcher = java.util.regex.Matcher[pattern=.+? region=0,5 lastmatch=]
scala> m.find
res3: Boolean = true
scala> m.group
res4: String = h
scala>