2012-11-06 75 views
0

我需要找到所有與「and」字連接的單詞對。scala:獲取正則表達式的所有可能匹配項

到目前爲止,我有以下嘗試:

val salute = """.*?(\w+\W+)and(\W+\w+).*""".r 

val salute(a,b) = "hello ladies and gentlemen, mesdames and messieurs, how are you?" 
a: String = "ladies " 
b: String = " gentlemen" 

現在,我想是這樣的:

salute.findAllMatches("hello ladies and gentlemen, mesdames and messieurs, how are you?") 
List[(java.lang.String, java.lang.String)] = List((ladies,gentlemen), (mesdames,mesieurs)) 

salute.findAllIn("hello ladies and gentlemen, mesdames and messieurs, how are you?").toList 
res14: List[String] = List(hello ladies and gentlemen, mesdames and messieurs, how are you?) 

嘗試,但,你可以看,沒有成功...

+0

......這是'Mesdames等Messieurs',順便... –

回答

3

您的正則表達式

.*?(\w+\W+)and(\W+\w+).* 

由於。*之前和之後已經匹配所有內容。將其更改爲(或類似的基於需求):

(\w+\W+)and(\W+\w+) 
0

爲了得到結果作爲像你描述上面,你可以做這兩件事情元組的列表:

改變你的正則表達式就沒有那麼貪心即不消耗整個字符串一次 例如:

""".(\w+) and (\w+)""".r 

使用findAllIn和使用上的所有比賽的RegexExtractor得到部分中捕捉括號

將所有內容放在一起產生期望的結果可能是這樣的一個解決方案:

val salute = """.(\w+) and (\w+)""".r 
val string = "hello ladies and gentlemen, mesdames and messieurs, how are you?" 

val results = for { 
    salute(left,right) <- (salute findAllIn string) 
} yield (left,right) 

println(results toList) 

結果

List((ladies,gentlemen), (mesdames,messieurs)) 
相關問題