字符串中的正则表达式hex字节

时间:2013-01-29 13:53:01

标签: regex string qt hex byte

我正在尝试验证Qt中LineEdit小部件的输入。我是第一次使用正则表达式,所以我可以使用一些帮助。我想允许1到32个十六进制字节用空格分隔,例如这应该是有效的:

"0a 45 bc 78 e2 34 71 af"

以下是无效输入的一些示例:

"1 34 bc 4e" - >它们需要成对编写,因此1必须为01。

"8a cb3 58 11" - > cb3无效。

"56 f2 a8 69 " - >不允许有尾随空格。

经过一番头疼之后,我想出了这个似乎有效的正则表达式:

"([0-9A-Fa-f]{2}[ ]){0,31}([0-9A-Fa-f]{2})"

现在回答我的问题:

  1. 您认为我的测试无法显示的正则表达式有任何问题吗?如果是这样,我该如何改进呢?

  2. 有更简洁的方法来写它吗?

  3. 提前致谢

1 个答案:

答案 0 :(得分:1)

我不确定您使用哪种方法进行验证,但一个可能的问题是该方法在字符串中搜索与模式匹配的子字符串,而不是检查字符串是否与模式匹配。使用exactMatch验证正则表达式的字符串。

在任何情况下,添加锚点^$都更安全(但在使用exactMatch时不需要):

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

由于您正在进行验证,因此您无需捕获。而且您不需要在[]

中添加空格
"^(?:[0-9A-Fa-f]{2} ){0,31}[0-9A-Fa-f]{2}$"

您可以使用setCaseSensitivity方法设置区分大小写。如果将其设置为Qt::CaseInsensitive,则可以稍微缩短正则表达式:

"^(?:[0-9a-f]{2} ){0,31}[0-9a-f]{2}$"