我的正则表达式无法摆脱​​引号

时间:2017-08-28 14:21:48

标签: regex scala

我写了这个正则表达式

val regex = """(?<=,|^)(((?:")([^"]*)(?:"))([^,]*))""".r

如果我给出输入行

val input = "\"FOO,BAR\",\"10,1\",12,This is Test,X,X"

现在,如果我这样做

regex.findAllIn(input).matchData.foreach(println)

我可以看到

"FOO,BAR"
"10,1"
12
This is Test
X
X

我的问题是在正则表达式中。我已经明确地将"放在非捕获组中(?:")所以输出标记应该是FOO,BAR而不是"FOO,BAR"

为什么非捕获组没有按预期工作?

编辑:基于下面的评论之一,非捕获组仍在匹配和消耗。我试图将表达式重写为

@ val regex = """(?<=,|^)(((?<=")([^"]*)(?="))|([^,]*))""".r

但现在它完全断开,因为OR表达式的第一部分从不匹配,输出是

"FOO
BAR"
"10
1"
12
This is Test
X
X

所以现在它只匹配[^,]*

的第二个条件

我也用Google搜索并找到了这个帖子

Parsing CSV input with a RegEx in java

但是接受的答案与我上面的答案有相同的问题

我希望看到表达式的输出是

FOO,BAR
10,1
12
This is Test
X
X

1 个答案:

答案 0 :(得分:1)

这有点令人费解,但似乎有效。

val regex = """(?<=,|^)("([^"]*)"|([^,]*))""".r
val input = "\"FOO,BAR\",\"10,1\",12,This is Test,X,X"

regex.findAllMatchIn(input).map{m => 
  Option(m.group(2)) getOrElse m.group(0)
}.foreach(println)

我必须同意Regex不适合CSV解析。