我刚写了一个控制台应用程序来替换大量utf-8编码文件中的某个字符串。我需要覆盖这个字符串的大约20个不同的情况,所以我将我的代码片段减少到必要的部分。 守则如下:
foreach (String file in allFIles)
{
string text = "";
using (StreamReader r = new StreamReader(file))
{
text = r.ReadToEnd();
}
if (text.Contains(Case1))
{
string textCase1 = "";
using (StreamReader rCase1Reader = new StreamReader(file))
{
textCase1 = rCase1Reader.ReadToEnd().Replace(Case1, Case1Const);
}
using (StreamWriter wCase1 = new StreamWriter(file, false, Encoding.UTF8))
{
wCase1.Write(textCase1);
}
UsedFIles.Add(file);
}
}
我的问题是,如果我尝试替换看起来像这样的字符串:"partnumber: 58"
并且还有一个看起来像这样的字符串"partnumber: 585"
我的问题是,如果当前字符串包含所需的子字符串,另外还有一个像"partnumber: 58"
和"partnumber: 585"
这样具有高相似性的字符串,我的代码也会替换高度相似的字符串。
有没有办法可以避免这种行为?
答案 0 :(得分:1)
读取整个文件,找到您感兴趣的字符串,然后检查它后面的位。假设文件有更多要阅读。
foreach (String file in allFIles)
{
string text = "";
using (StreamReader r = new StreamReader(file))
{
text = r.ReadToEnd();
}
int x = text.IndexOf(Case1);
while(x > -1)
{
if (text.Length - x > Case1.Length)
{
string nextBit = text.SubString(x + Case1.Length, 1);
if (IsDelimeter(nextBit))
{
text = Replace(text, x, Case1, Case1Const);
x += Case1Const.Length;
}
}
else
{
text = Replace(text, x, Case1 Case1Const);
break;
}
x = text.IndexOf(Case1, x + 1);
}
File.WriteAllText(file, text);
}
答案 1 :(得分:0)
使用正则表达式
new Regex(@"partnumber: 58$");
答案 2 :(得分:0)
你可以尝试:
var files = new[] { "File1.txt", "File2.txt", "File3.txt" };
// Where the key is the regex pattern to match and the value is the string to replace it with.
var patterns = new Dictionary<string, string>()
{
{ @"partnumber: \d\d", "FooBar" },
};
foreach(var file in files)
{
string str = File.ReadAllText(file);
foreach (var pattern in patterns)
str = Regex.Replace(str, pattern.Key, pattern.Value);
File.WriteAllText(file, str);
}
此示例使用正则表达式(正则表达式),模式partnumber: \d\d
匹配任何以&#39; partnumber开头的字符串:&#39;并以两位数结尾。正则表达式非常强大,您可以使用它来描述您想要匹配的特定情况,以便您可以针对多种模式进行扩展。