我有一个
的字符串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
或其他功能我可以用来改变路径中的值而不是提供将来会改变的索引。
答案 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 oldSubdirectoryB = "RN012345";
string newSubdirectoryB = "RN147258";
string fileNameWithPath = @"\server\MainDirectory\SubDirectoryA\RN012345\SubdirectoryC\MyFile.pdf";
fileNameWithPath = fileNameWithPath.Replace(oldSubdirectoryB, newSubdirectoryB);
答案 2 :(得分:-1)
您可以使用Regex.Replace
将SubDirectoryB
替换为所需的值
string a = @"\server\MainDirectory\SubDirectoryA\RN123456\SubdirectoryC\MyFile.pdf";
a = Regex.Replace(a, "RN[0-9]{6,6}","Mairaj");
此处我已将string
替换为RN
,然后将6 numbers
替换为Mairaj
。