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'
在第四对引号内。
最佳答案
如果我理解您的问题,您希望允许 ='foo'
成为也在 '...'
内的匹配的一部分。在这种情况下,您可以尝试使用此正则表达式
'\\w(=\\s*'[^']*'|[^'])*'
正则表达式的一些解释
|
代表OR
- 像
[abc]
这样的构造是character class - 它将匹配一个字符,在此示例中为a
b
或c
[^abc]
是否定字符类 - 它将接受任何不是a
b
也不是c
的字符
\\s
表示空格(例如空格、\t
、\n
、\r
...)\\w
表示可以在单词中使用的字符(0-9
a-z
A-Z
和下划线_
)*
是量词,这意味着它之前的元素可以出现零次或多次,例如ab*a
可以接受aa
aba
abba
abbba
等等。
现在解释我的正则表达式
'\w(=\s*'[^']*'|[^'])*'
[^']*
表示零个或多个非'
的字符。如果我们像'[^']*'
这样用'
包围它,这将表示以'
开头和结尾的文本,并且内部不再有'
,因此在像'foo' bar 'baz'
这样的文本的情况下,它可以匹配'foo'
'baz'
。它类似于'.*?'
。- 但我决定添加一种情况,而不是简单的
'[^']*'
,而不是第一个'
和最后一个'
之间的非'
-字符,我们还可以接受一系列='...'
(如='utf-8'
)。
演示:
String s ="'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',,,,,";
Pattern p = Pattern.compile("'\\w(=\\s*'[^']*'|[^'])*'");
Matcher m = p.matcher(s);
while (m.find())
System.out.println(m.group());
输出:
'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'
关于Java 匹配引号中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26855372/