Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分析包含带引号的逗号和换行符的逗号分隔值_Java_Regex_String_Parsing_Csv - Fatal编程技术网

Java 分析包含带引号的逗号和换行符的逗号分隔值

Java 分析包含带引号的逗号和换行符的逗号分隔值,java,regex,string,parsing,csv,Java,Regex,String,Parsing,Csv,我有一些特殊字符的字符串。 目的是检索每行(,分隔)的字符串[] 你有一个特殊的字符“在这里你可以有/n和 For example Main String Alpha,Beta,Gama,"23-5-2013,TOM",TOTO,"Julie, KameL Titi",God," timmy, tomy,tony, tini". 您可以在“”中看到You/n 有谁能帮我分析一下 谢谢 __更多解释 我需要用主刺把这些分开 Here Alpha Beta Gama 23-5-2013,TOM T

我有一些特殊字符的字符串。 目的是检索每行(,分隔)的字符串[] 你有一个特殊的字符“在这里你可以有/n和

For example Main String
Alpha,Beta,Gama,"23-5-2013,TOM",TOTO,"Julie, KameL
Titi",God," timmy, tomy,tony,
tini".
您可以在“”中看到You/n

有谁能帮我分析一下

谢谢

__更多解释

我需要用主刺把这些分开

Here Alpha
Beta
Gama
23-5-2013,TOM
TOTO
Julie,KameL,Titi
God
timmy, tomy,tony,tini
问题是:对于Julie、KameL和Titi来说,KameL和Titi之间存在断线/n或
timmy、tomy、tony、tini也有类似问题,tony和tini之间存在断线/n或


新文本在文件中(强制逐行读取)

输出我要删除此“


解析CSV比人们乍一看想象的要困难得多,这就是为什么您最好的选择是使用设计良好且经过测试的库来为您完成这项工作。有两个库是and,还有许多其他库。请查看这两个库,并使用最适合您的需求和风格的库。

尝试以下方法:

String source = "Alpha,Beta,Gama,\"23-5-2013,TOM\",TOTO,\"Julie, KameL\n"
              + "Titi\",God,\" timmy, tomy,tony,\n"
              + "tini\".";

Pattern p = Pattern.compile("(([^\"][^,]*)|\"([^\"]*)\"),?");
Matcher m = p.matcher(source);

while(m.find())
{
    if(m.group(2) != null)
        System.out.println( m.group(2).replace("\n", "") );
    else if(m.group(3) != null)
        System.out.println( m.group(3).replace("\n", "") );
}
如果它匹配不带引号的字符串,则结果将在组2中返回。 带引号的字符串在第3组中返回。因此,我需要在while块中进行区分。 你可能会找到一个更漂亮的方法

输出:
α
β
伽马
2013年5月23日,汤姆
TOTO
Julie,KameLTiti
上帝
蒂米、汤米、托尼、蒂尼
.

说明 考虑下面的powershell通用正则表达式示例,它不需要额外的处理来重新组装数据部分。第一个匹配组将匹配一个引号,然后将其带到匹配结束,这样您就可以确保捕获之间的整个值,但不包括引号OMMA,除非它们嵌入了引号分隔的子字符串

(?:^ |,\s{0,})([“]?)\s{0,}((?:.|\n |\r)*?)\1(?=[,]\s{0,}|$)

例子 产量 总结

  • (?:
    启动非捕获组
  • ^
    要求字符串开头
  • |
  • ,\s{0,}
    一个逗号,后跟任意数量的空格
  • 关闭非捕获组
  • 启动捕获组1
  • [“]?
    使用引号如果它存在,我喜欢这样做,以防你想在引号之后包含其他字符
  • 关闭捕获组1
  • \s{0,}
    使用任何空格(如果存在),这意味着您以后不需要修剪该值
  • 启动捕获组2
  • (?:.|\n |\r)*?
    捕获所有字符,包括新行、非贪婪字符
  • 关闭捕获组2
  • \1
    如果有报价,它将存储在组1中,因此如果有报价,则在此处需要它
  • (?=
    开始零断言前瞻
  • [,]\s{0,}
    必须有一个逗号,后跟可选空格
  • |
  • $
    字符串的结尾
  • 关闭零断言前瞻
有关解析CSV的与Java兼容的正则表达式,请参阅

它认识到:

  • 换行符(值后或引号内的值)
  • 包含转义双引号的带引号的值,如
    “this”“
简而言之,您将使用以下模式:
(?:,|\n | ^)(“(?:(?:)*[^”]*”(?:\n]*(?:\n |$)

然后在
find()
循环中收集每个匹配器
组(1)



注意:虽然我在这里发布了关于我发现的一个“体面”正则表达式的答案,只是为了避免人们搜索一个正则表达式,但它决不是健壮的。我仍然同意用户“fgv”:CSV解析器更可取。

ya这是可行的。你能解释一下我的
(((([^\][^,]*)|“([^\]*)\”)吗
:对于给定的输入,这很好。基本上,此输入在文件中,我必须逐行读取文件(必须逐行读取)。我使用BufferReader逐行读取文件,并将此行视为代码中的源代码。由于逐行读取,我无法删除“。我已将输入和输出附加到编辑部分注意:
[^\“]
可以匹配逗号。如果任何条目为空字符串,则此regexp将失败。因此“Ida”和“John”应显示在两行不同的行上?我想您需要在一行上显示“1234-5”。然后在第二行上显示“Ida,John”,在第三行上显示“25/11/1964”(不带引号)因为引号将Ida和John包含在一个字符串中。您是如何生成该图表的?这里有一些错误:
\s{0,}
在您的前瞻中是没有意义的,您正在使用带引号的字符串中的前导空格,以及其他不一致的空格处理方式。但最糟糕的问题是没有考虑转义反斜杠…这就是为什么大多数开发人员建议使用csv解析器而不是正则表达式。我不打算讨论使用正则表达式进行解析CSV。请求者通常有理由使用正则表达式而不是其他更强大的解析解决方案。我看到您也发布了一个基于正则表达式的解决方案,所以您在这里的感觉是没有意义的。
{0,}
构造表示零次或多次,并由
*
复制。OP不需要包括对转义反斜杠的支持。我知道
{0,}构造意味着,但我的观点是,包括一个可选的尾随空间,对于一个前瞻性来说并没有什么特别的,所以它是多余的。关于感觉的评论似乎有点离题。“regex,只是为了避免人们搜索一个,但我仍然同意。我将更新我的答案以使其更清楚。对于转义的双Qoootes,例如字符串
“alpha”“,“beta”“,“charlie”“,”delta“
,这似乎不正确。另请参见并单击Java按钮。@RoYoMi对于您发布的示例,它失败了。”
Alpha
Beta Charli
Delta
Delta Echo
Frank George
Henry
1234-5
Ida
John
"
25/11/1964
15/12/1964
40,000,000.00
0.0975
2
King
Lincoln
"
Mary / New York
123456
12543-01
Ocean
Peter
String source = "Alpha,Beta,Gama,\"23-5-2013,TOM\",TOTO,\"Julie, KameL\n"
              + "Titi\",God,\" timmy, tomy,tony,\n"
              + "tini\".";

Pattern p = Pattern.compile("(([^\"][^,]*)|\"([^\"]*)\"),?");
Matcher m = p.matcher(source);

while(m.find())
{
    if(m.group(2) != null)
        System.out.println( m.group(2).replace("\n", "") );
    else if(m.group(3) != null)
        System.out.println( m.group(3).replace("\n", "") );
}
$Matches = @()
$String = 'Alpha,Beta,Gama,"23-5-2013,TOM",TOTO,"Julie, KameL\n
Titi",God,"timmy, \n
tomy,tony,tini"'
$Regex = '(?:^|,\s{0,})(["]?)\s{0,}((?:.|\n|\r)*?)\1(?=[,]\s{0,}|$)'

Write-Host start with 
write-host $String
Write-Host
Write-Host found
([regex]"(?i)(?m)$Regex").matches($String) | foreach {
    write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'`t= value at $($_.Groups[2].Index) = '$($_.Groups[2].Value)'"
    } # next match
start with
Alpha,Beta,Gama,"23-5-2013,TOM",TOTO,"Julie, KameL\n
Titi",God,"timmy, \n
tomy,tony,tini"

found
key at 0 = ''   = value at 0 = 'Alpha'
key at 6 = ''   = value at 6 = 'Beta'
key at 11 = ''  = value at 11 = 'Gama'
key at 16 = '"' = value at 17 = '23-5-2013,TOM'
key at 32 = ''  = value at 32 = 'TOTO'
key at 37 = '"' = value at 38 = 'Julie, KameL\n
Titi'
key at 60 = ''  = value at 60 = 'God'
key at 64 = '"' = value at 65 = 'timmy, \n
tomy,tony,tini'