关于正则表达式:匹配Scala中的正则表达式

Matching against a regular expression in Scala

我经常将字符串与正则表达式进行匹配。在Java中:

Java.UTI.ReEX..Type。编译("W+")。matcher("TythIIS")匹配

哎哟。斯卡拉有很多选择。

  • "\\w+".r.pattern.matcher("this_is").matches
  • 江户十一〔一〕号
  • 埃多克斯1〔2〕
  • 埃多克斯1〔3〕
  • 第一个和Java代码一样重。

    第二个问题是无法提供已编译的模式("this_is".matches("\\w+".r"))。(这似乎是一个反模式,因为几乎每次有一个方法需要一个regex来编译时,都会有一个重载需要一个regex)。

    第三个问题是它滥用了unapplySeq,因此是神秘的。

    第四个在分解正则表达式的某些部分时非常好,但是当您只希望得到布尔结果时太重了。

    我是否缺少一种简单的方法来根据正则表达式检查匹配项?有没有理由不定义String#matches(regex: Regex): Boolean?实际上,String#matches(uncompiled: String): Boolean的定义在哪里?


    您可以这样定义模式:

    1
    scala> val Email ="""(\w+)@([\w\.]+)""".r

    如果匹配,findFirstIn将返回Some[String],否则返回None

    1
    2
    3
    4
    5
    scala> Email.findFirstIn("[email protected]")
    res1: Option[String] = Some(test@example.com)

    scala> Email.findFirstIn("test")
    rest2: Option[String] = None

    你甚至可以提取:

    1
    2
    3
    scala> val Email(name, domain) ="[email protected]"
    name: String = test
    domain: String = example.com

    最后,您还可以使用传统的String.matches方法(甚至回收先前定义的Email Regexp方法:

    1
    2
    scala>"[email protected]".matches(Email.toString)
    res6: Boolean = true

    希望这会有所帮助。


    我为那个问题创建了一个"pimp my library"模式。也许它能帮你。

    1
    2
    3
    4
    5
    6
    7
    8
    import util.matching.Regex

    object RegexUtils {
      class RichRegex(self: Regex) {
        def =~(s: String) = self.pattern.matcher(s).matches
      }
      implicit def regexToRichRegex(r: Regex) = new RichRegex(r)
    }

    使用示例

    1
    2
    3
    scala> import RegexUtils._
    scala>"""\w+""".r =~"foo"
    res12: Boolean = true


    我通常用

    1
    2
    val regex ="...".r
    if (regex.findFirstIn(text).isDefined) ...

    但我觉得这很尴尬。


    目前(2014年8月,scala 2.11)@david的回复告诉了标准。

    然而,似乎r."..."字符串插补器正在帮助实现这一点。看看如何在scala中使用正则表达式进行模式匹配?