Java 匹配引号中的内容

标签 java regex

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 bc
  • [^abc] 是否定字符类 - 它将接受任何不是 a b 也不是 c
  • 的字符
  • \\s 表示空格(例如空格、\t\n\r...)
  • \\w 表示可以在单词中使用的字符(0-9 a-z A-Z 和下划线_)
  • * 是量词,这意味着它之前的元素可以出现零次或多次,例如 ab*a 可以接受 aa aba abba abbba 等等。

现在解释我的正则表达式

'\w(=\s*'[^']*'|[^'])*'

Regular expression visualization

  • [^']* 表示零个或多个非 ' 的字符。如果我们像 '[^']*' 这样用 ' 包围它,这将表示以 ' 开头和结尾的文本,并且内部不再有 ',因此在像 '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/

相关文章:

java - 尝试从文件创建矩阵数组,但程序返回两个相同的矩阵?

java - 使用 JXL 访问 Excel 中超过 256 列

java - 在处理java响应Ajax中的重音字符时,应该使用哪种unicode UTF-8和UTF-16

python - 正则表达式获取 SQL 中的值

python - 正则表达式从以 _ 和 _ 下划线后的 str 结尾的字符串中获取数字

java - 仅提取第一次出现的字符以及连字符前后的所有数字

java - 方法重载显示 'incompatible type error' 带 float 但不带 double

java - Struts2 排除 com.sun :tools:jar:1. 需要 5.0 吗?

python - 如何使用 python 删除文件基名的扩展名

java - .hgignore 'target' 文件夹有一些异常(exception)