2017-07-25 33 views
0

因此,出于某种原因,在Scala 2.11中,我的锚定正则表达式模式充当未锚定的正则表达式模式。Scala锚定正则表达式作为未被传递的

scala> """something\.com""".r.anchored findFirstIn "app.something.com" 
res66: Option[String] = Some(something.com) 
scala> """^.something\.com$""".r.anchored findFirstIn "app.something.com" 
res65: Option[String] = None 

我认为第一个表达式将评估为None像第二(手动输入锚),但它没有。

任何帮助,将不胜感激。

回答

0

findFirstIn方法自动取消锚定正则表达式。

你可以看到,示例代码也匹配A只:

例子:
"""\w+""".r findFirstIn "A simple example." foreach println // prints "A"

BTW,一旦你创建了"pattern".r一个正则表达式,它是由默认的停靠,但只有当你在match块中使用正则表达式时才重要。在FindAllInFindFirstIn的内部,这种类型的锚定被忽略。

因此,为了确保正则表达式的整个字符串相匹配,随时添加^$(或\A\z)锚,如果你不知道你要去哪里使用正则表达式。

0

我认为,这是只应该与匹配的工作:

val reg = "o".r.anchored 
"foo" match { 
    case reg() => "Yes!" 
    case _ => "No!" 
} 

...返回 “不!”。 这看起来并不是很有用,因为只要"o".r被默认锚定。唯一使用这个我可以想像是,如果你做了一些unanchored,然后想取消它,或者如果你只是想匹配这两种情况下,但是小号 eparately(意外:)):

val reg = "o".r.unanchored 
"foo" match { 
    case reg.anchored() => "Anchored! 
    case reg() => "Unanchored" 
    case _ => "I dunno" 
}