2017-04-23 75 views
1

我有一個用例,我想從scala中的輸入中提取某些字符串。提取字符串與正則表達式在斯卡拉

我的輸入字符串類似:

asdwf:"ssdf", as232:"ss",ABC:"xxx",sdfsf234:"sdaf" 

我想xxxABC提取。

我試圖定義一個正則表達式匹配模式:
val Pattern = """ABC:"(.*)",""".r,但得到ABC:"xxx",sdfsf234:"sdaf"作爲輸出字符串。

任何我不正確的做法?

謝謝。

+0

你輸入字符串似乎有某種格式的,你知道是哪一個?它從何而來? –

回答

0

嘗試使用non-greedy expression,即:

val Pattern = """ABC:"(.*?)"""".r 

更新:

我不是一個scala用戶,我無法測試的代碼,但在理論上以下應更換所有值都是ABC

val res = """ asdwf:"ssdf", as232:"ss",ABC:"xxx",sdfsf234:"sdaf"""".replaceAll(""".*ABC:"(.*?)".*""", "$1") 

我參加了一個速成班scala和正則表達式似乎工作:

https://ideone.com/LAlCc0

+1

它的工作!任何方式我可以提取ABC後的ABC? – ChengXY

+0

@ChengXY我已經更新了答案,請看看。 –

2

你可以看看這樣

val p = """[^ :,"]+[\s]*:"[^"]*"""".r 
    p findAllIn """asdwf:"ssdf", as232:"ss",ABC:"xxx",sdfsf234:"sdaf"""" 

比賽現在,你可以得到一個所有匹配的迭代器。

您可以提取其內容是這樣

(p findAllIn """asdwf:"ssdf", as232:"ss",ABC:"xxx",sdfsf234:"sdaf"""").map(str => { 
     val p(key, value) = str 
     (key, value) 
    }).toMap