Extract data from Specific format CSV files
数据格式列在上面的链接中。
基本上,我想用引号来提取所有字段,如:
'data0,data1,data2,,,','.........'
我使用这样的正则表达式:
String subrow = row.replaceFirst("'\\w.*?',",",");
这将始终匹配一对引号中的第一个内容。
然而,有这样的情况:
例如
data1 = "encoding = 'utf-8'"
仍然如果我使用上面的方法,它将匹配:
'data0,encoding='
除了
'data0,encoding='utf-8',data2,,,'
然后如何修改正则表达式以匹配一对引号中的内容,即使其中还有另一对引号? (零或一对报价)
PS:将在测试中使用文本:
'1415561780,84,0,130,52','0,0,0,97517573,0,0,0,0,0,,,','corpvpn,ac103f20,57771,42eb9375,80,0','4,http%3a%2f%2flenovoappssystemupdateprod.112.2o7.net%2fb%2fss%2flenovoappssystemupdateprod%2f6,,0,0,,text/xml; encoding='utf-8',595,207,595,161,595,0,1,0,0,0,ac10ff1b,18604,42eb9375,80,0,','200,text/xml,text/xml,64,64,481,64,472,64,0,0,0',,,,,
请注意有一个:
encoding='utf-8'
在第四对引号内。
答案 0 :(得分:1)
如果我了解您的问题,您希望='foo'
成为匹配的一部分,该匹配也位于'...'
内。在这种情况下,您可以尝试使用此正则表达式
'\\w(=\\s*'[^']*'|[^'])*'
正则表达式的一些解释
|
代表OR
[abc]
的结构是character class - 它会匹配一个字符,在此示例中为a
b
或c
[^abc]
是否定字符类 - 它会接受任何 不 a
b
或{{1} } c
表示空格(例如空格,\\s
,\t
,\n
...)\r
表示可在单词中使用的字符(\\w
0-9
a-z
和下划线A-Z
)_
是量词,这意味着它之前的元素可以显示为零{或}次,如*
可以接受ab*a
aa
aba
{{ 1}}等等。现在解释我的正则表达式
abba
abbba
代表零个或多个不是'\w(=\s*'[^']*'|[^'])*'
的字符。如果我们使用[^']*
'
来围绕'
这将代表以'[^']*'
开头和结尾但内部不再有'
的文字,因此如果是{{1}这样的文字它可以匹配'
'foo' bar 'baz'
。它类似于'foo'
。'baz'
我决定在第一个'.*?'
和最后一个'[^']*'
之间添加案例,而不是非'
- 字符我们也可以接受一系列'
(例如'
)。演示:
='...'
输出:
='utf-8'