修改字符串值
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 oldSubdirectoryB = "RN012345";
string newSubdirectoryB = "RN147258";
string fileNameWithPath = @"\server\MainDirectory\SubDirectoryA\RN012345\SubdirectoryC\MyFile.pdf";
fileNameWithPath = fileNameWithPath.Replace(oldSubdirectoryB, newSubdirectoryB);
您可以使用 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
。
假设您只需要替换那些 \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
正则表达式是
\RN([0-9]{6})\
它匹配一个\
和\
,然后匹配RN
,然后匹配并捕获到第1组六位数字(与([0-9]{6})
)然后将匹配一个\
。在替换部分,m.Groups[1].Value.Distinct().Count() == m.Groups[1].Value.Length
检查不同数字的个数是否与捕获的子串的个数相同,如果是,则数字唯一并进行替换,否则,将整个匹配放回进入替换结果。
我有一个字符串是
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 oldSubdirectoryB = "RN012345";
string newSubdirectoryB = "RN147258";
string fileNameWithPath = @"\server\MainDirectory\SubDirectoryA\RN012345\SubdirectoryC\MyFile.pdf";
fileNameWithPath = fileNameWithPath.Replace(oldSubdirectoryB, newSubdirectoryB);
您可以使用 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
。
假设您只需要替换那些 \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
正则表达式是
\RN([0-9]{6})\
它匹配一个\
和\
,然后匹配RN
,然后匹配并捕获到第1组六位数字(与([0-9]{6})
)然后将匹配一个\
。在替换部分,m.Groups[1].Value.Distinct().Count() == m.Groups[1].Value.Length
检查不同数字的个数是否与捕获的子串的个数相同,如果是,则数字唯一并进行替换,否则,将整个匹配放回进入替换结果。