2014-04-12 130 views
0

我試圖解析以下字符串解析報價在斯卡拉

val s1 = """ "foo","bar", "foo,bar" """ 

進出把這個分析,我希望是......

List[String] ["foo","bar","foo,bar"] length 3 

我能夠解析以下

val s2 = """ "foo","bar", 'foo,bar' """ 

通過使用以下模式

val pattern = "(('[^']*')|([^,]+))".r 

pattern.findAllMatchIn(s2).map(_.toString).toList 
gives ["foo","bar", 'foo,bar'] :length 3 

EDIT 目前我能夠解析: 「富,酒吧,FOO欄」=> [富,酒吧,FOO欄「] 」富,酒吧, '富酒吧「'=> [富,酒吧,「富酒吧」] // LEN 3

我想分析這些線路以及..

但我不能找出模式爲S2 ..請注意,我需要解析這兩個s1和s2成功

目前我能解析:

"foo,bar,foo bar" => [foo,bar,foo bar"] 
    "foo,bar, 'foo bar' " => [foo, bar , 'foo bar'] //len 3 

我想分析這些線路以及..下面的行一起:

""" foo, bar, "foo,bar" """ // gives [foo,bar,"foo,bar"] len 3 
+1

見https://stackoverflow.com/questions/8055727/negating-a-backreference-in-regular-expressions一些相關的模式 – DNA

回答

3

以下作品爲您s1s2例子:

(["']).*?\1 

["']相匹配的雙或單報價(這是作爲一個組被捕獲)。然後,我們匹配任何後面跟隨開頭報價的結束報價(使用捕獲組\1)。我們使用非貪婪的匹配.*?,以便我們不消費結束報價。

請注意,您需要使用三重引用,因爲該模式中有一個名言:

val pattern = """(["']).*?\1""".r 

更新處理進一步病例加入到一個問題:

同時還處理您的以逗號分隔的示例,您需要匹配單詞字符組合\w或空白\s,以逗號或行尾結尾,但不包括使用向前查看的終止字符(?=(,|$))

(["']).*?\1|\w(\w|\s)*(?=(,|$)) 
+0

你能後的完整的regex圖案......我不知道我理解?? – Fraz

+0

@DNA ..對不起,我想我不清楚..目前的模式可以解析一些其他情況,以及「富,酒吧,foobar」或「富,酒吧,'富,酒吧'」..有沒有辦法修改 – Fraz

+0

只是爲了確認模式是val pattern =「」「([」'])。*?\ 1 |(\ w | \ s)+(?=(,| $ ))「」「。r – Fraz