2014-04-12 91 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