2010-12-21 62 views
0

首先,我很喜歡 ...獲取列表出提取的 - 甚至是比賽

scala> var nameRE = """\W*(\w+)\W+(\w+)\W*""".r 
nameRE: scala.util.matching.Regex = \W*(\w+)\W+(\w+)\W* 

scala> var nameRE(first, last) = "Will Smith " 
first: String = Will 
last: String = Smith 

然後我就像混賬 ...

scala> var listOfVowels = "(([aeiou])*)".r 
listOfVowels: scala.util.matching.Regex = (([aeiou])*) 

scala> var listOfVowels(vowels:List[String]) = "uoiea" 
<console>:7: error: scrutinee is incompatible with pattern type; 
found : List[String] 
required: java.lang.String 
     var listOfVowels(vowels:List[String]) = "uoiea" 

現在我很喜歡呵呵 ...

scala> (listOfVowels findFirstMatchIn "uoiea" get) subgroups 
res35: List[String] = List(a) 

[如果我的問題並不明顯:我如何獲得一個模式匹配的所有子組的清單,理想情況是在提取器中,但無論如何不寫第二級匹配器。當然,這裏的正確答案是List(u, o, i, e, a)。 ]

回答

2

這將讓你提取模式:

scala> var listOfVowels(vowels @ _*) = "uoiea" 
vowels: Seq[String] = List(uoiea, a) 

然而圖案不會做你希望它是什麼 - 它不產生多個組。正則表達式庫規則是一組括號,一組以及我認識的每一個正則表達式。

+0

每個reqex * api *都可以這樣工作,但底層庫肯定支持嵌套組。 Scala API可能並不是單獨暴露嵌套組,但我已經習慣了Scala不會吸收大多數其他語言吸引的領域。啊,那麼追求完美還在繼續。 – Malvolio 2010-12-23 02:54:07

+0

@Malvolio啊,好吧,我會給你的。我希望它也能工作。唉,我對Scala的正則表達式有着長期的愛和恨。它給人一瞥天堂,但未能貫徹。如果我已經確定了一個好的API,那麼我現在已經創建了一個替代庫。 – 2010-12-23 12:32:52

2

據我所知,在正則表達式中將(E)*類型的子模式轉換爲字符串列表是不可能的。這是因爲Scala中使用的正則表達式機制是使用JDK的正則表達式的默認實現(java.util.Pattern,java.util.Matcher等)實現的,並且此實現不支持捕獲多個子模式。在匹配的情況下,子模式(E)*將僅捕獲該子模式的最後匹配。據我所知,這種行爲甚至適用於大多數正則表達式實現。

雖然我相信你的情況是你的實際問題的簡化版本,所描述的情況下,一個簡單的解決方案是存在的:

scala> "[aeiou]".r findAllIn "hello, world!" toList 
res1: List[String] = List(e, o, o) 

希望幫助。

1

這是有點文體上馬虎。

scala> implicit def mkRr(regex: String) = new { def rr = new { def unapply(s: String) = (regex.r findAllIn s toList) match { case Nil => None ; case xs => Some(xs) } } } 
mkRr: (regex: String)java.lang.Object{def rr: java.lang.Object{def unapply(s: String): Option[List[String]]}} 

scala> val ListOfVowels = "[aeiou]".rr 
ListOfVowels: java.lang.Object{def unapply(s: String): Option[List[String]]} = [email protected] 

scala> val ListOfVowels(vowels) = "uoiea" 
vowels: List[String] = List(u, o, i, e, a) 
相關問題