[英]Previously tested Regex is not working now, but works in Regex Tester
[英]Previously working REGEX match now fails
作為在構建腳本中清理配置文件的一部分,我們有這樣的事情:
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位,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-9a-zA-Z]
不匹配,而不是Password=
或Password2=
部分。 很可能在該密碼中存在非字母數字字符。
試試這個正則表達式(在RegexPal.com上使用似乎工作)。 我確實逃脫了等號。
@"Password[1-3]\\=""[0-9a-zA-Z]*"""
這是我的測試文本:
密碼1 =“嗒嗒”
密碼2 = “blah2”
Password3 = “045and2”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.