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”可能被视为一种模式,但它不在 {} 内,并且如前所述,它已经正确运行了好几年。

我已经针对可能的超时进行了测试,但这似乎不是问题。我已经尝试过不区分大小写的选项,无论如何这都不重要([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" />
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="Blah"
Password2="blah2"
Password3="045and2"

于 2013-03-14T19:28:32.600 回答