ビルドスクリプトで構成ファイルをクリーンアップする一環として、次のようなものがあります。
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」はパターンと思われるかもしれませんが、{}の中にはなく、前述のように、数年前から正しく動作しています。
タイムアウトの可能性についてテストしましたが、それは問題ではないようです。私はCaseInsensitiveオプションを試しましたが、これはとにかく問題ではないはずです([a-zA-Z]、そうですか?)。これも効果がありません。
2つの異なる(Win 7 Professional、64ビット、SP1)マシンでは失敗しますが、XPマシン(SP 3)では期待どおりに機能します。
これが今朝のWindows7自動更新の結果でない限り、私は困惑しています。
完全なコンテキストは次のとおりです。
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" />