修改字符串值

时间:2017-02-15 10:22:52

标签: c# regex

我有一个

的字符串
string a = @"\server\MainDirectory\SubDirectoryA\SubDirectoryB\SubdirectoryC\MyFile.pdf";

SubDirectoryB 始终以 RN 前缀开头,后跟6个唯一数字。现在我尝试修改字符串的SubDirectoryB部分以替换为新值,让我们说 RN012345

所以新字符串应该看起来像

string b = @"\server\MainDirectory\SubDirectoryA\RN012345\SubdirectoryC\MyFile.pdf";

为实现这一点,我使用了以下帮助方法

public static string ReplaceAt(this string path, int index, int length, string replace)
{
   return path.Remove(index, Math.Min(length, path.Length - index)).Insert(index, replace);
}

现在效果很好。

然而,orginial路径将在不久的将来发生变化,因此它会像@\MainDirectory\RN012345\AnotherDirectory\MyFile.pdf那样。所以我想知道是否有regex或其他功能我可以用来改变路径中的值而不是提供将来会改变的索引。

3 个答案:

答案 0 :(得分:2)

假设您只需要替换每个\RNxxxxxx\是唯一数字的x,您需要捕获6位数并分析匹配评估器中的子字符串。

var a = @"\server\MainDirectory\SubDirectoryA\RN012345\SubdirectoryC\MyFile.pdf";
var res = Regex.Replace(a, @"\\RN([0-9]{6})\\", m =>
        m.Groups[1].Value.Distinct().Count() == m.Groups[1].Value.Length ?
          "\\RN0123456\\" : m.Value);
// res => \server\MainDirectory\SubDirectoryA\RN0123456\SubdirectoryC\MyFile.pdf

请参阅C# demo

正则表达式是

\\RN([0-9]{6})\\

它将\\\匹配,然后匹配RN,然后匹配并捕获到第1组六位数(([0-9]{6})),然后匹配{{ 1}}。在替换部分中,\检查不同数字的数量是否与捕获的子字符串的数量相同,如果是,则数字是唯一的并且发生替换,否则,整个匹配被放回进入替换结果。

答案 1 :(得分:0)

使用String.Replace

string oldSubdirectoryB = "RN012345";
string newSubdirectoryB = "RN147258";

string fileNameWithPath = @"\server\MainDirectory\SubDirectoryA\RN012345\SubdirectoryC\MyFile.pdf";

fileNameWithPath = fileNameWithPath.Replace(oldSubdirectoryB, newSubdirectoryB);

答案 2 :(得分:-1)

您可以使用Regex.ReplaceSubDirectoryB替换为所需的值

string a = @"\server\MainDirectory\SubDirectoryA\RN123456\SubdirectoryC\MyFile.pdf";
a = Regex.Replace(a, "RN[0-9]{6,6}","Mairaj");

此处我已将string替换为RN,然后将6 numbers替换为Mairaj