使用正则表达式 (? 配合 regex.split 可以按逗号拆分字符串,同时忽略引号内的逗号。具体做法是定义一个匹配“非引号字符后紧跟逗号”的正则模式,调用 regex.split(input, pattern),该方法会返回去除分隔符后的子串数组,且不会在引号内部进行切割。

如何处理带引号的CSV数据并提取字段?
直接回答:使用 Regex.Split 结合负向断言可以安全地分割包含引号的CSV行。输入为 "a,b","c,d",e,调用 Regex.Split(str, @"(?,结果得到三个元素:"a,b"、"c,d" 和 e。关键在于正则中的 [^"]* 确保只匹配未被引号包裹的逗号。

using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = @""a,b","c,d",e";
// 正则解释:
// (?<p>运行上述代码,预期输出为三行:<br>"a,b"<br>"c,d"<br>e<br>这证明了引号内的逗号被保留在字段值中,而外部的逗号作为分隔符被移除。</p><h2>如果存在嵌套引号或转义字符怎么办?</h2><p>直接回答:标准正则无法处理复杂的嵌套引号或转义序列(如 <code>""</code> 表示单个引号)。对于更严格的CSV解析,应使用专门的库如 <code>TextFieldParser</code> 或第三方库 <code>CsvHelper</code>。但在简单场景下,若需支持转义,可修改正则以允许 <code>""</code> 出现在引号内。例如,输入 <code>"a,""b"",c"</code>,上述简单正则可能失效,因为 <code>""</code> 会被视为闭合和开启新引号。此时建议改用状态机或专用解析器。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill2795" title="C#"><img
src="https://img.php.cn/upload/skill/000/000/081/178936933912641.jpg" alt="C#" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill2795" title="C#" class="overflowclass">C#</a>
<p class="overflowclass">"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"</p>
</div>
<a rel="nofollow" href="/xiazai/skill2795" title="C#" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p><img src="https://img.php.cn/upload/article/001/431/639/179452878895455.png?x-oss-process=image/resize,p_40" alt="C#怎么按逗号拆分,同时忽略引号内的逗号?"></p><pre class="brush:php;toolbar:false;">using System;
using System.IO;
using Microsoft.VisualBasic.FileIO;
class Program
{
static void Main()
{
string csvLine = @""a,""b"",c"";
using (var parser = new TextFieldParser(new StringReader(csvLine)))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.HasFieldsEnclosedInQuotes = true;
string[] fields = parser.ReadFields();
foreach (var field in fields)
{
Console.WriteLine(field);
}
}
}
}
使用 TextFieldParser 时,设置 HasFieldsEnclosedInQuotes = true 后,输入 "a,""b"",c" 将正确解析为三个字段:a、"b"(注意内部引号被转义处理)、c。这是处理复杂CSV的标准做法。
基于程序中某个输入、条件或结果的具体问题
直接回答:当输入字符串为空或仅包含逗号时,Regex.Split 的行为取决于是否启用 RegexOptions.None。若输入为 "",结果为空数组;若输入为 ",",结果为两个空字符串 ["", ""]。这是因为正则匹配到了逗号并将其移除,留下了两边的空部分。开发者需注意此边界情况,避免索引越界。










