2016-11-23 50 views
2

我有字符串,例如可以是3D-F2-C9-A6-B3字節正則表達式有隔板

這是我的正則表達式,我已經通過在線測試儀的正則表達式驗證它:

^([0-9A-Fa-f]{2}[-]){0,}$ 

問題是,示例字符串3D-F2-C9-A6-B3-4F無效。我不得不在末尾添加一個減號,如3D-F2-C9-A6-B3-4F-

如何更改中間的分隔符必須設置但沒有人在最後的正則表達式?

回答

2

,最好的辦法就是把它打開一點:

^[0-9A-Fa-f]{2}(?:-[0-9A-Fa-f]{2})*$ 

regex demo

詳細

  • ^ - 字符串的開始
  • [0-9A-Fa-f]{2} - 2個字符從定義的集合
  • (?:-[0-9A-Fa-f]{2})* - 的
    • -零個或更多序列 - 一個連字符
    • [0-9A-Fa-f]{2} - 從所定義的2個字符設定
  • $ - 串的端部(更好的選擇是\z匹配非常結尾的字符串)

C# demo

var pattern = @"^[0-9A-Fa-f]{2}(?:-[0-9A-Fa-f]{2})*\z"; 
var input = "3D-F2-C9-A6-B3"; 
var matched = Regex.IsMatch(input, pattern); // = > True 
+0

通常,人們張貼的溶液等'^([0-9A發-F] {2} [ - ]){0,}在'[$'(注意了''? - ]')?通過這種方式,匹配變得非線性,它也允許'-'出現在字符串的末尾,並且在某些情況下導致性能較差並且字符串很長。重複像你這樣的模式('[0-9A-Fa-f]')在這裏不是什麼大問題(你甚至可以使用'RegexOptions.IgnoreCase'和刪除'AZ'來縮短它),否則只需動態地構建模式用重複塊定義一個變量。 –