dbostream
dbostream

Reputation: 811

Regular expression hex bytes in string

I am trying to validate the input of a LineEdit widget in Qt. I am using regular expressions for the first time so I could use some help. I want to allow 1 to 32 hex bytes separated by a space, for example this should be valid:

"0a 45 bc 78 e2 34 71 af"

And here are some examples of invalid input:

"1 34 bc 4e" -> They need to be written in pairs, so 1 must be 01.

"8a cb3 58 11" -> cb3 invalid.

"56 f2 a8 69 " -> No trailing space is allowed.

After some head scratching I came up with this regex which seems to work:

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

Now on to my questions:

  1. Do you see any problems with my regex that my tests have failed to show? If so how can I improve it?

  2. Is there a cleaner way to write it?

Thanks in advance

Upvotes: 0

Views: 5097

Answers (1)

nhahtdh
nhahtdh

Reputation: 56819

I am not sure what method you used for validation, but one possible problem is that the method searches the string for substring that matches the pattern rather than checking the string matches the pattern. Use exactMatch for validate a string against a regular expression.

In any case, adding anchors ^ and $ is safer (not necessary when exactMatch is used, though):

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

Since you are doing validation, you don't need capturing. And you don't need to put space in []

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

You can set case-sensitivity with setCaseSensitivity method. If you set it to Qt::CaseInsensitive, you can shorten the regex a bit:

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

Upvotes: 2

Related Questions