2016-11-23 56 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'来缩短它),否则只需动态地构建模式用重复块定义一个变量。 –