簡體   English   中英

C#正則表達式匹配太慷慨

[英]c# Regex matches too generous

我需要確認客戶編號的格式,該編號必須為#####-##的格式(#為0-9數字,而破折號為文字破折號)。

我使用RegexBuddy構建了正則表達式(可讓您輸入測試字符串以確保它正確)。 我最終得到了:

\d{5}-\d{2}

這測試很好,給了我想要的結果-受到“打擊”:

12345-01

而且沒有匹配

12345

該工具提供了以多種語言使用此正則表達式的代碼-我想在C#中使用此正則表達式為與整個字符串的匹配返回true。 這給了我下面的內容,我已經將它們放入了代碼中。

Regex.IsMatch(c.Bill_To, @"\A\d{5}-\d{2}\Z")

但是此代碼返回我的12345作為匹配項!

我做錯什么了嗎?

您的RegEx可以正常工作。 嘗試檢查c.Bill_To值。

        bool testResult;

        var testSuccess = "12345-01";
        testResult = Regex.IsMatch(testSuccess, @"\A\d{5}-\d{2}\Z"); //is True

        var testFail = "12345";
        testResult = Regex.IsMatch(testFail, @"\A\d{5}-\d{2}\Z"); //is False

我想我看到您遇到的問題。 如果您的客戶編號之一與其他內容一起包含在字符串中,則您使用的模式無效。 同時指定\\A\\Z意味着您的客戶編號必須在字符串的開頭開始,在字符串的末尾結束才能匹配。 \\A類似於^ ,它匹配字符串的開頭, \\Z類似於$ ,它匹配字符串的結尾-區別在於它們忽略是否指定了MultiLine選項。

嘗試使用以下模式: \\b\\d{5}-\\d{2}\\b

僅當您的客戶編號位於字母數字字符和非字母數字字符之間時,它才會與您的客戶數字匹配。 這也意味着即使下面的LINQPad腳本中的最后一個測試用例中所示,即使客戶號之間不只是空格,也可以找到它們。

const string pattern = @"\b\d{5}-\d{2}\b";

Regex.IsMatch("12345", pattern).Dump(); // no match
Regex.IsMatch("12345-12", pattern).Dump(); // match
Regex.IsMatch("12345-1234", pattern).Dump(); // no match
Regex.IsMatch("word 12345 word", pattern).Dump(); // no match
Regex.IsMatch("word 12345-12 word", pattern).Dump(); // match
Regex.IsMatch("word 12345-1234 word", pattern).Dump(); // no match
Regex.IsMatch("word@12345-12@word", pattern).Dump(); // match

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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