斯卡拉正则表达式奇怪的行为

时间:2012-06-11 18:04:45

标签: regex scala

scala> val p = "ab|ba|(ab)*a|(ba)*b".r
p: scala.util.matching.Regex = ab|ba|(ab)*a|(ba)*b

scala> val m = p.pattern.matcher _
m: java.lang.CharSequence => java.util.regex.Matcher = <function1>

scala> m("aa").matches
res9: Boolean = false

scala> p.findAllIn("aa").toList
res10: List[String] = List(a, a)
根据res9,

“aa”不应匹配。但res10表示有2场比赛。你怎么解释这个?

2 个答案:

答案 0 :(得分:4)

aa将匹配,因为您使用的是find

(ab)*a将匹配a

也许你想要一个像这样的表达式:

^(?:ab|ba|(?:ab)*a|(?:ba)*b)$

答案 1 :(得分:4)

你问两件事:

当您使用m("aa").matches时,您会询问整个字符串aa是否与模式m相对应。

当您使用p.findAllIn("aa").toList时,您询问aa子字符串是否与模式m相对应。

所以,是的,有一些匹配m的子串,但完整的字符串aa本身不匹配。