首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与Scala中的正则表达式匹配

与Scala中的正则表达式匹配
EN

Stack Overflow用户
提问于 2011-11-28 20:25:45
回答 4查看 28.6K关注 0票数 33

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

java.util.regex.Pattern.compile("\w+").matcher("this_is").matches

唉哟。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"))。(这似乎是一种反模式,因为几乎每次有一个方法需要regex编译,就有一个重载需要regex)。

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

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

我是不是遗漏了一种检查正则表达式匹配的简单方法?为什么没有定义String#matches(regex: Regex): Boolean?实际上,String#matches(uncompiled: String): Boolean是在哪里定义的?

EN

Stack Overflow用户

回答已采纳

发布于 2011-11-28 21:04:21

您可以定义如下模式:

代码语言:javascript
运行
复制
scala> val Email = """(\w+)@([\w\.]+)""".r

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

代码语言:javascript
运行
复制
scala> Email.findFirstIn("test@example.com")
res1: Option[String] = Some(test@example.com)

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

你甚至可以提取:

代码语言:javascript
运行
复制
scala> val Email(name, domain) = "test@example.com"
name: String = test
domain: String = example.com

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

代码语言:javascript
运行
复制
scala> "david@example.com".matches(Email.toString)
res6: Boolean = true

希望这能帮上忙。

票数 33
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8301858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档