【发布时间】:2013-11-27 08:23:53
【问题描述】:
我编写了一个实用程序,它打开一个基于文本的文件,加载为字符串并使用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;
}
}
【问题讨论】:
-
深思熟虑:如果我将一个文件放在一个大小超过您所拥有的内存量的文件夹中怎么办?目前您的解决方案将失败。也许您应该逐行替换,而不是一次替换整个文件。
-
允许用户输入一个正则表达式字符串通常是一个坏主意,因为他们很容易在脚上开枪。一个例外可能是一个开发工具——用户应该事先知道它是一个正则表达式,并且有足够的知识来逃避他们的反斜杠。做一个正则表达式的外行是行不通的,你可能应该重新考虑你的方法。
-
获取反馈,但它是技术帮助台的支持工具。