作为清理构建脚本中配置文件的一部分,我们有这样的东西:
Regex.IsMatch(LongStringOfFilecontents, @"Password=""[0-9a-zA-Z]*""")
和
Regex.IsMatch(LongStringOfFilecontents, @"Password2=""[0-9a-zA-Z]*""")
找到匹配项后,密码将在应用程序发布之前替换为虚拟值。
问题是它现在找到了“Password”,但没有找到“Password2”或“Password1”。
这段 C# .NET 3.5 代码已经使用了几年,已经运行了数百次,并且没有改变。就在几天前,它已成功运行。截至今天早上,它在“Password2”上窒息。配置文件确实包含 Password="一些任意值" 和 Password2="一些任意值"。
我怀疑“d2”可能被视为一种模式,但它不在 {} 内,并且如前所述,它已经正确运行了好几年。
我已经针对可能的超时进行了测试,但这似乎不是问题。我已经尝试过不区分大小写的选项,无论如何这都不重要([a-zA-Z],对吗?),这也没有效果。
它在两台不同的(Win 7 Professional、64 位、SP1)机器上失败,但在 XP 机器(SP 3)上按预期工作。
除非这是今天早上 Windows 7 自动更新的结果,否则我感到很困惑。
这是完整的上下文:
ReplaceInFile(filename, @"Password1=""[0-9a-zA-Z]*""", @"Password1=""REPLACE_ME""");
private static bool ReplaceInFile(string filename, string regexp, string replacement)
{
try
{
if (File.Exists(filename))
{
string oldContents = null;
using (StreamReader reader = new StreamReader(filename, true))
{
oldContents = reader.ReadToEnd();
}
if (Regex.IsMatch(oldContents, regexp))
{
string newContents = Regex.Replace(oldContents, regexp, replacement);
if (oldContents != newContents)
{
File.WriteAllText(filename, newContents);
return true;
}
}
else
{
BuildFailed("DID NOT FIND " + regexp + " in " + filename + " Case-SeNsiTive?");
}
}
return false;
}
catch (Exception ex)
{
BuildFailed(ex.Message);
return false;
}
}
这是正在检查的大文件的一小部分:
<Kirk Enabled="1" Type="8000" Password1="test_pwd" Password2="dev_pwd" UserName1="admin" UserName2="GW-DECT/admin" DutyCycle="1" TcpPort="10000" ServerIP="localhost" />