C# 正则表达式拆分引号和逗号语法错误 [重复]

Posted

技术标签:

【中文标题】C# 正则表达式拆分引号和逗号语法错误 [重复]【英文标题】:C# Regex Split Quotes and Comma Syntax Error [duplicate] 【发布时间】:2019-03-13 15:06:30 【问题描述】:

我有一个文本文件如下:

"0","Column","column2","Column3"

我已设法将数据分解为以下内容:

"0"
"Column"
"Column2"
"Column3"

,(?=(?:[^']*'[^']*')*[^']*$),现在我想删除引号。我已经测试了表达式[^\s"']+|"([^"]*)"|\'([^\']*) 一个在线正则表达式测试器,它给出了我正在寻找的正确输出。但是,使用表达式时出现语法错误:

String[] columns = Regex.Split(dataLine, "[^\s"']+|"([^"]*)"|\'([^\']*)");

语法错误 ',' 预期

我尝试转义字符但无济于事,我错过了什么吗?

任何帮助将不胜感激!

谢谢。

【问题讨论】:

您可能希望找到一个 CSV 解析器。 见***.com/questions/6542996/… 【参考方案1】:

C# 可能正在转义反斜杠。试试:

String[] columns = Regex.Split(dataLine, @"[^\s""']+|"([^""]*)""|\'([^\']*)");

【讨论】:

出于同样的原因,这仍然是一个语法错误。您需要使用"" 在逐字字符串文字中表示单个"(使用@ 语法)。 谢谢 - 很好的接机;固定【参考方案2】:

问题是正则表达式中的双引号,编译器阻塞它们,认为它们是字符串的结尾。 你必须像这样逃避它们:

"[^\s\"']+|\"([^\"]*)\"|\'([^\']*)"

Edit:

您实际上可以使用一个正则表达式完成所有您想要的操作,而无需先拆分:

@"(?<=[""])[^,]*?(?=[""])"

这里我使用了一个@带引号的字符串,其中双引号被加倍而不是转义。

正则表达式使用向后查找来查找双引号,然后匹配除逗号 ',' 之外的任何字符零次或多次,然后向前查找双引号。

如何使用

string test = @"""0"",""Column"",""column2"",""Column3""";
Regex regex = new Regex(@"(?<=[""])[^,]*?(?=[""])");
foreach (Match match in regex.Matches(test))

    Console.WriteLine(match.Value);

【讨论】:

谢谢!很有帮助。【参考方案3】:

您需要转义正则表达式中的双引号,因为它们正在关闭字符串文字。此外,要处理“无法识别的转义序列”,您需要转义 \s 中的 \

两种方法:

使用反斜杠转义所有相关字符:"[^\\s\"']+|\"([^\"]*)\"|\'([^\']*)" 使用@ 语法来表示“逐字”字符串文字。双引号仍然需要被转义,而是对每个"使用""@"[^\s""']+|""([^""]*)""|'([^']*)"

无论如何,当我测试您的新正则表达式时,它似乎也捕获了一些空组,请参见此处:https://dotnetfiddle.net/1WQE4R

【讨论】:

以上是关于C# 正则表达式拆分引号和逗号语法错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 和正则表达式删除引号 (") 内的所有逗号

拆分分隔字符串并删除转义序列[重复]

Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]

正则表达式用逗号分隔 - 不在括号或单引号内

Bigquery 正则表达式 - 删除双引号中的逗号

Java:拆分逗号分隔的字符串但忽略引号中的逗号