鍍金池/ 教程/ Scala/ 分解 Email 地址的例子
定義 Extractor
正規(guī)表達(dá)式
Extractors 和 Seq 模式
可變參數(shù)的 Extractors
無參數(shù)和帶一個(gè)參數(shù)的模式定義
分解 Email 地址的例子

分解 Email 地址的例子

前面我們介紹了使用模式匹配來分解數(shù)據(jù),本專題教程對(duì)這些概念加以推廣。到目前為止,構(gòu)造器模式是和 Case Class 關(guān)聯(lián)在一起的。有些時(shí)候你希望使用類似的模式而不需要?jiǎng)?chuàng)建 Case Class。實(shí)際上你可能希望創(chuàng)建自定義的模式。 Extractor(解析器)可以幫助你完成這些任務(wù)。本篇以一個(gè)簡(jiǎn)單的例子來介紹 Extractor 的概念和用法。

比方說給定一個(gè)代碼 Email 地址的字符串,你需要判斷它是否是一個(gè)有效的 Email 地址,如果是有效的 Email 地址,你需要分別取出用戶名和域名兩個(gè)部分。傳統(tǒng)的實(shí)現(xiàn)方法可以定義如下三個(gè)輔助函數(shù):

def isEmail(s:String): Boolean
def domain(s:String): String
def user(s:String): String

使用這些方法,你可以使用如下代碼分析輸入的字符串:

if(isEmail(s)) println(user(s) + " AT " + domain(s))
else println("not an email address")

這段代碼功能是正確的,但比較笨拙,而且如果需要同時(shí)有多個(gè)測(cè)試時(shí)情況就變得比較復(fù)雜,比如你在一串字符串中尋找相連的同一個(gè)用戶名的 Email 地址。

我們之前介紹的模式匹配處理這類問題非常有效。簡(jiǎn)單你可以使用

Email(user,domain)

來匹配一個(gè)字符串。這個(gè)模式可以匹配含有“@”有個(gè)字符串,使用這個(gè)模式,你可以使用 user,domain 分別綁定用戶名和域名。我們使用模式匹配重寫前面的例子:

s match{
    case Email(user,domain) => println (user + " AT " + domain)
    case _ => println ("not an email address")
}

而解決尋找相連兩個(gè)同名的 Email 地址可以使用如下代碼:

s match{
    case Email(u1,d1)::Email(u2:d2):: _ if(u1==u2) => ...
    ...
}

這段代碼看起來簡(jiǎn)單明了,但問題是 String(s 的類型)不是一個(gè) case class。 它們不具有可以表示為 Email(user,domain)的方法。 此時(shí)我們就可以借助于 Extractor,它們支持為這些內(nèi)置的類型定義新的模式。