2012-06-11 87 views
0
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场比赛。你如何解释这个?因为你用findscala正则表达式奇怪行为

回答

4

aa将被匹配。

(ab)*a将匹配a

也许你想表达这样的:

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

谢谢。我想要你输入的预测,而不是我想出的那个。如果你不介意,你能解释你是怎么想出来的。 –

+0

@kr,组变动和锚'^'和'$'添加到模式的开始和结束。 '^'匹配字符串的开头,'$'匹配字符串的结尾。 – Qtax

+0

我知道的^意义和$,但到底是什么(?:AB)是什么意思?谢谢。 –

4

你问两个不同的东西:

当您使用m("aa").matches,你问整个字符串aa是否与模式m

当您使用p.findAllIn("aa").toList,你问是否有子的aa相对应的模式m

所以,是的,没有符合m的子字符串,但满弦aa本身并没有。