簡體   English   中英

以前工作的REGEX匹配現在失敗了

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM