gpt4 book ai didi

Java 匹配引号中的内容

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:25 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com