C#替换为正则表达式

C#替换为正则表达式,c#,regex,visual-studio-2010,csv,replace,C#,Regex,Visual Studio 2010,Csv,Replace,我是VB、C#的新手,正在努力学习正则表达式。我想我已经用下面的代码格式在我的文件中用空格替换正则表达式匹配 编辑:根据注释,此代码块已更改 var fileContents = System.IO.File.ReadAllText(@"C:\path\to\file.csv"); fileContents=fileContents.Replace(fileContents,@“regex”,“”) 我的文件格式如下: "1111111","22222222222","Text that ma

我是VB、C#的新手,正在努力学习正则表达式。我想我已经用下面的代码格式在我的文件中用空格替换正则表达式匹配

编辑:根据注释,此代码块已更改

var fileContents = System.IO.File.ReadAllText(@"C:\path\to\file.csv");
fileContents=fileContents.Replace(fileContents,@“regex”,“”)

我的文件格式如下:

"1111111","22222222222","Text that may, have a comma, or two","2014-09-01",,,,,,
到目前为止,我已经有正则表达式在
,“
”,
之间找到任何包含逗号的字符串(第一个或最后一个单元格中从来没有逗号,所以我不担心排除这两个。我正在

(?m.ToString().Replace(“,”,”);
//将结果写回文件
System.IO.File.writealText(@“C:\path\to\File.csv”,fileContents);

尝试用以下内容解析所有列:

 Regex regex = new Regex("(?<=\").*?(?=\")");

可能没有那么快,但应该可以工作。

通过将[^”]+与“向前看”
?=
和“向后看”
?相结合,我可能会使用Regex.Replace重载,它需要委托返回替换的文本。
当您有一个简单的正则表达式来识别模式,但需要为替换做一些不那么简单(复杂逻辑)的事情时,这非常有用

我发现保持正则表达式的简单性会在以后试图维护它们时带来好处

注意:这与@Florian的回答类似,但此替换仅限于匹配文本中的替换

string exp = "(?<=,\")([^\"]+,[^\"]+)(?=\",)";
var regex = new Regex(exp); 
string replacedtext = regex.Replace(filecontents, m => m.ToString().Replace(",",""))

stringexp=”(?这里有一种不规则语言。这是因为逗号可以表示不同的东西,这取决于它在文本流中的位置。奇怪的是,正则表达式被设计用于解析规则语言,其中逗号表示相同的东西,而不管它在文本流中的位置。不规则语言需要一个事实上,正则表达式主要用于在字符串进入解析器之前对字符串进行标记

虽然您尝试使用正则表达式来完成操作,但速度可能非常慢。例如,您可以使用以下方法(即使逗号是字段中的第一个或最后一个字符,也可以使用以下方法)。但是,每次它找到逗号时,都必须前后扫描以检查它是否位于两个引号字符之间

 (?<=,"[^"]*),(?=[^"]*",)
在这种情况下,使用正则表达式会很不走运

谢天谢地,处理CSV文件的代码非常简单:

    public static IList<string> ParseCSVLine(string csvLine)
    {
        List<string> result = new List<string>();
        StringBuilder buffer = new StringBuilder();

        bool inQuotes = false;
        char lastChar = '\0';

        foreach (char c in csvLine)
        {
            switch (c)
            {
                case '"':
                    if (inQuotes)
                    {
                        inQuotes = false;
                    }
                    else
                    {
                        if (lastChar == '"')
                        {
                            buffer.Append('"');
                        }
                        inQuotes = true;
                    }
                    break;

                case ',':
                    if (inQuotes)
                    {
                        buffer.Append(',');
                    }
                    else
                    {
                        result.Add(buffer.ToString());
                        buffer.Clear();
                    }
                    break;

                default:
                    buffer.Append(c);
                    break;
            }

            lastChar = c;
        }
        result.Add(buffer.ToString());
        buffer.Clear();

        return result;
    }
公共静态IList解析csvLine(字符串csvLine)
{
列表结果=新列表();
StringBuilder缓冲区=新的StringBuilder();
bool-inQuotes=false;
char lastChar='\0';
foreach(csvLine中的字符c)
{
开关(c)
{
案例'':
如果(以引号引)
{
inQuotes=false;
}
其他的
{
如果(lastChar==“”)
{
Append(“”);
}
inQuotes=true;
}
打破
案例',':
如果(以引号引)
{
Append(',');
}
其他的
{
Add(buffer.ToString());
buffer.Clear();
}
打破
违约:
缓冲区。附加(c);
打破
}
lastChar=c;
}
Add(buffer.ToString());
buffer.Clear();
返回结果;
}

在我所给出的代码中,CSV文件经常会遇到另外几个问题。首先,如果一个字段中间有一个行尾字符,那么会发生什么?第二个问题是,如何知道CSV文件的编码字符是什么?这两个问题的前一个是通过修改代码稍微容易解决的。但是,如果不与向您提供文件的人员达成一致意见,第二个问题几乎是不可能的。

Java的相同问题是:Filecontents.Replace不会为初学者替换regex。您创建一个regex regex=new regex(pattern);然后执行regex.Replace(Filecontents,replacement)@DStanley我不想分裂世界string@FlorianSchmidinger谢谢你的解释,我会这样尝试,但仍然需要找出正确的答案regex@RichardN-当您使用该正则表达式时,它只会找到它所替换的单个字符。match evaluator委托是一个昂贵的回调,其主要目的是进行子替换使用相同的正则表达式,试试这个
Console.WriteLine(regex.Replace(@“,”一,二“,”)(?在这种情况下,
input
是否为
filecontents
?这工作正常。您甚至可以使用
(?是的,我想这也行。这永远不会发生,因为我正在处理的文件是以特定格式自动生成的,字段中的
仅以
10000
1000000
等数字显示。我想我甚至可以使用
(?=[0-9]+),(?=[0-9]+)
好了,这很有道理。谢谢这里的所有细节。这是非常有信息性的。只是想澄清一下,我的正则表达式是
(?)?
 Regex regex = new Regex("(?<=\").*?(?=\")");
 foreach(Match match in regex.Matches(filecontents))
 {
      fileContents = fileContents.Replace(match.ToString(), match.ToString().Replace(",",string.Empty))
 }
string exp = "(?<=,\")([^\"]+,[^\"]+)(?=\",)";
var regex = new Regex(exp); 
string replacedtext = regex.Replace(filecontents, m => m.ToString().Replace(",",""))
 (?<=,"[^"]*),(?=[^"]*",)
"1111111","22222222222","Text that may, have a comma, Quote"" or two","2014-09-01",,,,,,
    public static IList<string> ParseCSVLine(string csvLine)
    {
        List<string> result = new List<string>();
        StringBuilder buffer = new StringBuilder();

        bool inQuotes = false;
        char lastChar = '\0';

        foreach (char c in csvLine)
        {
            switch (c)
            {
                case '"':
                    if (inQuotes)
                    {
                        inQuotes = false;
                    }
                    else
                    {
                        if (lastChar == '"')
                        {
                            buffer.Append('"');
                        }
                        inQuotes = true;
                    }
                    break;

                case ',':
                    if (inQuotes)
                    {
                        buffer.Append(',');
                    }
                    else
                    {
                        result.Add(buffer.ToString());
                        buffer.Clear();
                    }
                    break;

                default:
                    buffer.Append(c);
                    break;
            }

            lastChar = c;
        }
        result.Add(buffer.ToString());
        buffer.Clear();

        return result;
    }