用C#中的Regex替换文件中的路径

本文关键字:路径 文件 替换 中的 Regex | 更新日期: 2023-09-27 18:28:58

因此,我有一个包含一些文件路径的文本文件。这些路径需要部分替换。这需要不区分大小写,所以我试着用Regex来做这件事。

文件的一部分如下所示:

PATH1         = d:'Software'system'SETUP'folder1
PATH2         = d:'Software'system'SETUP'folder2
PATH3         = d:'Software'system'SETUP

第一部分:d:'Software'system需要更换为c:'Software'system

我用以下代码尝试了这个:

string text = File.ReadAllText(filePath);
string pattern = "d:''Software''system";
string replace = "C:''Software''system";
string newText = Regex.Replace(text, pattern, replace, RegexOptions.IgnoreCase);
File.WriteAllText(filePath, newText);

但是,这不会更改文件中的任何内容。我还使用了断点来分析Replace行之后的newText的值,它与文件的编写无关。

非常感谢您的帮助!

用C#中的Regex替换文件中的路径

使用一个Regex.Escape方法来转义您的文字模式:

这里有一个测试代码:

var text = @"PATH1         = d:'Software'system'SETUP'folder1
PATH2         = d:'Software'system'SETUP'folder2
PATH3         = d:'Software'system'SETUP";
string pattern = "d:''Software''system";
string replace = "C:''Software''system";
string newText = Regex.Replace(text, Regex.Escape(pattern), replace.Replace("$", "$$"), RegexOptions.IgnoreCase);
//                                   ^^^^^^^^^^^^^
Console.WriteLine(newText);

另一种方法是使用需要与CompareMethod.Text:一起使用的Microsoft.VisualBasic.Strings.Replace

Text
可选根据系统区域设置确定的不区分大小写的文本排序顺序进行字符串比较
如果字符串包含所有文本字符,并且您希望在考虑字母等效性(如不区分大小写和紧密相关的字母)的情况下进行比较,则这种类型的比较非常有用。例如,您可能希望将A和A视为相等,并将Éandä置于B和B之前。

代码:

var newText = Microsoft.VisualBasic.Strings.Replace(text, 
               pattern, 
               replace, 
               Compare: Microsoft.VisualBasic.CompareMethod.Text);

在您的模式中''S表示非空白,''S表示空白。你需要通过用反斜杠转义来使反斜杠成为文字:

所以要么:

string pattern = @"d:''Software''system";

或者:

string pattern = "d:''''Software''''system";

对于文件路径,您可以转换路径、模式并替换.ToUpper(),然后执行正常的string newPath = path.Replace(pattern, replace);

p.S.如果生成的路径字符串大小写很重要,那么Regex.Escape解决方案会更好。