Regex.Replace包含大字符串和反斜杠

时间:2013-11-26 23:11:09

标签: c# regex

我编写了一个实用程序,它打开一个基于文本的文件,load作为一个字符串,并使用RegEx.Replace执行查找/替换功能。

它在许多文件上执行此操作,用户将其指向文件夹,输入查找字符串,替换字符串以及文件夹中包含文件中的字符串的所有文件都被替换。

这很有效,直到我用反斜杠尝试它才会失效。

很简单:

newFileContent = Regex.Replace(fileContent, @findString, @replaceString, RegexOptions.IgnoreCase);

fileContent =基于文本的文件的内容。它将包含回车。

findString =用户输入要查找的字符串

replaceString =用户输入的字符串,用

替换找到的字符串

我已经尝试添加一些逻辑来反击反斜杠,如下所示,但是在模式结束时非法失败。

 if (culture.CompareInfo.IndexOf(findString, @"\") >= 0)
     {
      Regex.Replace(findString, @"\", @"\\");
     }

成功处理反斜杠需要做什么才能成为查找/替换逻辑的一部分?

下面的整个代码块。

//open reader
                using (var reader = new StreamReader(f,Encoding.Default)) 
                {
                    //read file
                    var fileContent = reader.ReadToEnd();

                    Globals.AppendTextToLine(string.Format(" replacing string"));

                    //culture find replace
                    var culture = new CultureInfo("en-gb", false);
                    //ensure nothing has changed
                    if (culture.CompareInfo.IndexOf(fileContent, findString, CompareOptions.IgnoreCase) >= 0)
                    {

                        //if find or replace string contains backslahes
                        if (culture.CompareInfo.IndexOf(findString, @"\") >= 0)
                        {
                            Regex.Replace(findString, @"\", @"\\");
                        }

                        //perform replace in new string
                        if (MainWindow.Main.chkIgnoreCase.IsChecked != null && (bool) MainWindow.Main.chkIgnoreCase.IsChecked)                        
                            newFileContent = Regex.Replace(fileContent, @findString, @replaceString, RegexOptions.IgnoreCase);
                        else
                            newFileContent = Regex.Replace(fileContent, @findString, @replaceString);

                        result[i].Result = true;
                        Globals.AppendTextToLine(string.Format(" success!"));
                    }
                    else
                    {
                        Globals.AppendTextToLine(string.Format(" failure!!"));
                        break;
                    }
                }

2 个答案:

答案 0 :(得分:2)

将用户输入传递到Replace方法时,您应该使用Regex.Escape

  

转义一组最小字符(\,*,+,?,|,{,[,(,),^,$ ,.,   #,和空格)用它们的转义码替换它们。这指示正则表达式引擎解释这些字符   字面上而不是元字符。

例如:

newFileContent = Regex.Replace(fileContent,
                               Regex.Escape(findString),
                               replaceString,
                               RegexOptions.IgnoreCase);

答案 1 :(得分:1)

你的根本问题是你让你的用户输入一个任意的正则表达式,因此,它被解释为正则表达式...

你的目标是只是来替换文字字符串,在这种情况下使用String.Replace或你想要允许用户输入正则表达式,在这种情况下只是接受用户需要\逃避他们的特殊字符。

因为\是一个regexp转义字符(除了c#one,但你似乎用@处理它)“\”是一个非法的正则表达式,因为你逃脱了什么

如果真的希望rexexp将所有\替换为\\,那么:

Regex.Replace(findString, @"\\", @"\\\\"); --ie one \ after escape, two chars after escape.

但是你还有[]。*等担心。

我的强烈建议是一个复选框,用户可以选择是否输入正则表达式或字符串文字进行替换,然后相应地调用String.Replace或Regex.Replace