【问题标题】:Idiomatic regex matching in ScalaScala中的惯用正则表达式匹配
【发布时间】:2010-09-18 16:21:16
【问题描述】:

我正试图让我的 Scala 代码更加地道。现在它看起来就像 Java 代码。

我正在尝试在 Scala 中做一个简单的布尔正则表达式匹配函数,因为我似乎无法在标准库中找到它(?)

我不认为使用 try-catch 和 all 的结果特别好。此外,前提条件是“patt”只有一个组,我并没有真正将其用于任何事情。有什么输入吗?

def doesMatchRegEx(subj:String, patt:scala.util.matching.Regex) = {
    try{
        val Match = patt
        val Match(x) = subj
        true
    } catch {
        // we didnt match and therefore got an error
    case e:MatchError => false
    }
}

用途:

scala> doesMatchRegEx("foo",".*(foo).*".r)
res36: Boolean = true

scala> doesMatchRegEx("bar",".*(foo).*".r)
res37: Boolean = false

【问题讨论】:

标签: regex scala


【解决方案1】:
def doesMatchRegEx(subj:String, patt:scala.util.matching.Regex) = subj match {
  case patt(_) => true
  case _ => false
}

如您所见,这实际上使 'doesMatchRegEx 方法有点多余。

这样:

"foo".matches(".*(foo).*") // => true
"bar".matches(".*(foo).*") // => false
".*(foo).*".r.findFirstIn("foo").isDefined // => true

【讨论】:

  • 在我渴望使用 Scala 的过程中,我完全忘记了我正在使用 java.lang.String 并且它有一个匹配方法。谢谢你 :-) 关于 match-case-thing - 也很好,但正如我所见,我仍然必须将它包装在一个方法中以将其用作布尔表达式 - 它是多余的吗?
  • 由于 Scala 中的所有内容都会返回一些东西,因此 match 也会这样做。所以你可以写 val b = subj match ... 并且 b 将包含真/假。如果这就是你的意思?
  • 是的,你是对的,可以使用匹配来代替。一开始我没听懂。
猜你喜欢
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多