Scala Anchored Regex扮演着无人问津的角色

时间:2017-07-25 21:56:31

标签: regex scala

因此,出于某种原因,在Scala 2.11中,我的锚定正则表达式模式充当了无锚的正则表达式模式。

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,但事实并非如此。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

findFirstIn方法自动解锁正则表达式。

您可以看到示例代码仅匹配A

  

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

顺便说一句,一旦你创建了一个像"pattern".r这样的正则表达式,默认情况下它会被锚定,但这只在你在match块中使用正则表达式时才有意义。在FindAllInFindFirstIn内,只会忽略此类锚定。

因此,为了确保正则表达式匹配整个字符串,如果您不确定在哪里,请始终添加^$(或\A\z)锚点将使用正则表达式。

答案 1 :(得分: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"
}