修改字符串值

Modifying string value

我有一个字符串是

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);
}

目前效果很好。

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

使用String.Replace

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

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

fileNameWithPath = fileNameWithPath.Replace(oldSubdirectoryB, newSubdirectoryB);

您可以使用 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

假设您只需要替换那些 \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}))然后将匹配一个\。在替换部分,m.Groups[1].Value.Distinct().Count() == m.Groups[1].Value.Length检查不同数字的个数是否与捕获的子串的个数相同,如果是,则数字唯一并进行替换,否则,将整个匹配放回进入替换结果。