匹配Scala中的正则表达式

sch*_*mmd 31 regex scala

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

java.util.regex.Pattern.compile( "\ W +").匹配( "this_is").匹配

哎哟.Scala有很多选择.

  1. "\\w+".r.pattern.matcher("this_is").matches
  2. "this_is".matches("\\w+")
  3. "\\w+".r unapplySeq "this_is" isDefined
  4. val R = "\\w+".r; "this_is" match { case R() => true; case _ => false}

第一个和Java代码一样重.

第二个问题是您无法提供已编译的模式("this_is".matches("\\w+".r")).(这似乎是一种反模式,因为几乎每次有一个采用正则表达式进行编译的方法都存在需要正则表达式的重载).

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

第四个在分解正则表达式的部分时很好,但是当你只想要一个布尔结果时,它太重了.

我错过了一种简单的方法来检查正则表达式的匹配吗?有String#matches(regex: Regex): Boolean没有定义的原因?事实上,在哪里String#matches(uncompiled: String): Boolean定义?

Dav*_*vid 33

您可以定义这样的模式:

scala> val Email = """(\w+)@([\w\.]+)""".r
Run Code Online (Sandbox Code Playgroud)

findFirstInSome[String]如果匹配则返回None.

scala> Email.findFirstIn("test@example.com")
res1: Option[String] = Some(test@example.com)

scala> Email.findFirstIn("test")
rest2: Option[String] = None
Run Code Online (Sandbox Code Playgroud)

你甚至可以提取:

scala> val Email(name, domain) = "test@example.com"
name: String = test
domain: String = example.com
Run Code Online (Sandbox Code Playgroud)

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

scala> "david@example.com".matches(Email.toString)
res6: Boolean = true
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助.


Ian*_*ird 14

我为这个问题创建了一个"Pimp my Library"模式.也许它会帮助你.

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)
}
Run Code Online (Sandbox Code Playgroud)

使用示例

scala> import RegexUtils._
scala> """\w+""".r =~ "foo"
res12: Boolean = true
Run Code Online (Sandbox Code Playgroud)