2016-10-10 121 views
1

分開的話,我試圖匹配以下字符串Scala的正則表達式匹配標籤從字符串

"name  type  this is a comment" 

名稱和類型是肯定有。 評論可能存在也可能不存在。 我試圖將這個存儲到變量n,t和c中。

val nameTypeComment = """^(\w+\s+){2}(?:[\w+\s*)*\(\,\,]+)""" 
str match { case nameType(n, t, c) => print(n,t,c) } 

這是我有,但似乎並沒有工作。任何幫助表示讚賞。

val nameType = """^(\w+)\s+([\w\)\(\,]+)""".r 

但是這作品時,我試圖與僅名稱和類型,並沒有評論這是一組單詞可能或不存在的字符串工作。

+0

你能修改你的問題以包含錯誤信息嗎? – stefanobaghino

+0

嘗試http://ideone.com/RwG7yl –

+0

正則表達式看起來過於複雜。如果他們真的是製表符分隔,只是''分裂''\ t' –

回答

0

請注意,^(\w+\s+){2}(?:[\w+\s*)*\(\,\,]+)正則表達式只包含1個捕獲組((\w+\s+)),而在match塊中定義3。

^(\w+)\s+([\w\)\(\,]+)只包含2個捕獲組:(\w+)([\w\)\(\,]+)

爲了使您的代碼正常工作,您需要定義3個捕獲組。此外,還不清楚分隔符是什麼,讓我假設前兩個字段只是一個或多個由一個或多個空格分隔的字母數字/下劃線符號。評論是2個第一個字段之後的任何內容。

然後,使用

val s = "name  type  this comment a comment" 
val nameType = """(\w+)\s+(\w+)\s+(.*)""".r 
val res = s match { 
    case nameType(n, t, c) => print(n,t,c) 
    case _ => print("NONE") 
} 

online demo

請注意,我們需要編譯一個regex對象,正則表達式模式nameType後在.r注意。

注意,內部match圖案是錨固默認字符串錨^的開始可以省略。

此外,最好添加case _來定義未找到匹配項時的行爲。

+0

這工作。謝謝。 你能解釋一下([\ w \)\(\,] +)嗎? – dreddy

+0

你的意思是你的模式'([\ w)(\,] +)'部分?它匹配字符類中定義的一個或多個字符:字符(字母/數字/下劃線),'(',')'或','。 –