4

ビルドスクリプトで構成ファイルをクリーンアップする一環として、次のようなものがあります。

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" />
4

2 に答える 2

4

あなたの問題は、またはの部分[0-9a-zA-Z]ではなく、パスワードの内容が一致しない可能性が高いと思います。そのパスワードに英数字以外の文字が含まれている可能性があります。Password=Password2=

于 2013-03-14T19:28:17.080 に答える
1

この正規表現を試してみてください (RegexPal.com で使用するとうまくいくようです)。等号をエスケープしました。

@"Password[1-3]\=""[0-9a-zA-Z]*"""

これが私のテストテキストです:

Password1=
"何とか" Password2="何とか 2"
Password3="045and2"

于 2013-03-14T19:28:32.600 に答える