我写了这个正则表达式
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
答案 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解析。