我在下面有这个正则表达式
^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)*)
只接受
0x12 0x34 0xA2
它应该拒绝
0x12, 0x34
我这样用,
if(true != Regex.IsMatch(inputData, @"^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)*)"))
{
Console.WriteLine("error");
}
但即使我给0x12, 0x34
或任何字符串,它总是给出真实的。
有人可以解决这个问题吗?感谢
答案 0 :(得分:4)
您在正则表达式的末尾缺少$
字符。 $
字符匹配字符串或行的结尾。目前,它正在检查字符串是否以零个或多个指定长度的十六进制字符串开头。任何字符串都将以字符串的至少0个实例开头,因此所有字符串当前都匹配。
正则表达式应该看起来像^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)*)$
。
或者,如果您希望它至少以其中一个十六进制字符串开头,则应将最后一个*
字符替换为+
,这将匹配一个或多个实例。
该正则表达式看起来像^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)+)$
。
最后,如果您希望字符串用空格分隔,则需要稍微修改一下。这两个正则表达式都允许连续的字符串,中间没有空格。我觉得'正确'的正则表达式会相当难看,所以你最好在空格上使用String.Split
并忽略空行,在每个字符串上运行正则表达式^0[xX]([0-9a-fA-F]{2})$
。
答案 1 :(得分:1)
您应该使用$
结束正则表达式。没有它,它将匹配逗号前的数字并返回true。应该是这样的:
^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)*)$
如果您不想匹配空行,请将最终*
更改为+
:
^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)+)$
此外,如果您不使用这些组,则可以删除大部分括号:
^(\s*0[xX][0-9a-fA-F]{2}\s*)+$