Scala正则表达式模式匹配组与使用findAllIn不同

时间:2014-12-26 09:43:15

标签: regex scala scala-2.10

我发现通过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')。 为什么不是这样?

2 个答案:

答案 0 :(得分:1)

这是因为你没有指定第二个懒惰匹配的程度。所以在=之后它只消耗一个字符,并在懒惰模式下停止。

见这里。

https://regex101.com/r/dU7oN5/10

将其更改为.+?=.+以获取完整数组

答案 1 :(得分:0)

特别是,模式匹配使用unapplySeq使用Matcher.matches,而findAllIn使用Matcher.findmatches尝试匹配整个输入。

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>