作为清理构建脚本中配置文件的一部分,我们有类似这样的内容:
Regex.IsMatch(LongStringOfFilecontents, @"Password=""[0-9a-zA-Z]*""")
和
Regex.IsMatch(LongStringOfFilecontents, @"Password2=""[0-9a-zA-Z]*""")
找到匹配项后,在应用程序发布之前,密码将替换为虚拟值。
问题是它现在找到“密码”但不是“密码2”或“密码1”。
这个C#.NET 3.5代码已经使用了好几年,已经运行了数百次,而且还没有改变。就在几天前,它已成功运行。截至今天早上,它在“Password2”上窒息。配置文件确实包含Password =“某个任意值”和Password2 =“某个任意值”。
我怀疑“d2”可能被视为一种模式,但它不在{}内,并且如上所述,它已经表现了好几年了。
我已经针对可能的超时进行了测试,这似乎不是问题。我已经尝试了CaseInsensitive选项,无论如何都应该无关紧要([a-zA-Z],对吗?)并且也没有效果。
它在两台不同的(Win 7 Professional,64 bit,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" />
答案 0 :(得分:4)
我认为您的问题更可能是密码的内容与[0-9a-zA-Z]
不匹配,而不是Password=
或Password2=
部分。很可能在该密码中存在非字母数字字符。
答案 1 :(得分:1)
尝试使用此正则表达式(在RegexPal.com上使用似乎有效)。我确实逃脱了等号。
@"Password[1-3]\=""[0-9a-zA-Z]*"""
这是我的测试文字:
密码1 =“Blah”
Password2 =“blah2”
Password3 =“045and2”