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的定义在哪里?
- 值得注意的是,String#matches(string: String)既不是由2.9规范定义的,也不是由标准库中的类字符串类型定义的。事实上,它是Java中字符串定义的一个伪事实。
- 我不明白你在第一个例子中说的超重是什么意思?你是说代码太长了,还是说它做了太多的工作?
- 太多的代码,工作正是我想要的
- @IG0774,谢谢你这么说。我很困惑为什么找不到它。
您可以这样定义模式:
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方法:
。
希望这会有所帮助。
- 是的,我想我可以做一件事。
- @Schmmd别忘了.r来构建Regex。
- 哎呀!在Regex中定义matches不是很好吗?
- @谢谢你的建议。您可以使用传统的string.matches方法,并像这样循环使用以前定义的Regex:"[email protected]".matches(Email.toString)->将返回true。
- @上面给出的regex """(\w+)@([\w\.]+)""".r不会将abc@gmail_com解析为有效的电子邮件吗?regex不应该是"""(\w+)@([a-zA-Z0-9.]+)""".r吗?
我为那个问题创建了一个"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 |
。
- 酷!虽然我把运算符EDOCX1 11称为EDCX1,而不是12,因为在EDOCX1中13的操作符看起来像地方突变(来自C++和Python约定……)。
- 是的,我的目标是Perl的=~但显然是把名字倒过来了。
- 我想我会提到Haskell也有一个=~操作符来匹配正则表达式。我见过~=过去的意思是不平等,就像!=一样。
- 谢谢你们的评论,伙计们。我已编辑了答案以反映您的建议。
我通常用
1 2
| val regex ="...". r
if (regex. findFirstIn(text ). isDefined) ... |
。
但我觉得这很尴尬。
目前(2014年8月,scala 2.11)@david的回复告诉了标准。
然而,似乎r."..."字符串插补器正在帮助实现这一点。看看如何在scala中使用正则表达式进行模式匹配?