以前工作的REGEX匹配现在失败了

时间:2013-03-14 19:11:57

标签: c# .net regex

作为清理构建脚本中配置文件的一部分,我们有类似这样的内容:

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

2 个答案:

答案 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”