0

我正在尝试验证 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. 有没有更简洁的写法?

提前致谢

4

1 回答 1

2

我不确定您使用什么方法进行验证,但一个可能的问题是该方法在字符串中搜索与模式匹配的子字符串,而不是检查字符串是否与模式匹配。用于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}$"
于 2013-01-29T14:05:19.637 回答