C#.NET Regex删除所有引号,不包括句子中的一个实例

时间:2014-03-03 15:48:20

标签: c# .net regex

我的描述字段是:

16" Alloy Upgrade 

以CSV格式显示如下:

"16"" Alloy Upgrade "

使用正则表达式来保持原始格式的最佳方法是什么?在我学习的过程中,我会感激它因我的理解而被打破。

我已经在使用正则表达式来分割一些分隔2个字段的文本:代码,描述。我正在使用这个:

 ,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))

我的想法是删除引号,然后删除分隔符,不包括在句子中使用。

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您不想/不能使用标准的CSV解析器(我建议使用),您可以使用正则表达式删除所有非加倍引号:

Regex.Replace(text, @"(?!="")""(?!"")",string.Empty)

该正则表达式将匹配不在"之前或之后的每个"字符。

答案 1 :(得分:1)

我不会使用正则表达式,因为它们通常令人困惑并且完全不清楚它们的作用(例如你问题中的那个)。相反,这种方法可以解决这个问题:

public string CleanField(string input)
{
    if (input.StartsWith("\"") && input.EndsWith("\""))
    {
        string output = input.Substring(1,input.Length-2);
        output = output.Replace("\"\"","\"");
        return output;
    }
    else
    {
        //If it doesn't start and end with quotes then it doesn't look like its been escaped so just hand it back
        return input;
    }
}

它可能需要调整,但实质上它会检查字符串是否以引号开头和结尾(如果它是转义字段,它应该如此)然后如果是这样取得内部部分(使用子字符串)然后替换双引号用单引号。由于所有的转义,代码有点难看,但没有避免。

好处是,可以使用一些Linq轻松使用现有数组并转换它。

processedFieldArray = inputfieldArray.Select(CleanField).ToArray();

我在这里使用数组纯粹是因为你的链接页面似乎在你想要这个解决方案的地方使用它们。