1

I have the following QRegExpValidator

QRegExpValidator doubleValidator = new QRegExpValidator(QRegExp("[-+]?[0-9]*[\\.,]?[0-9]+([eE][-+]?[0-9]+)?"));

It's supposed to be a Double numbers validator that accepts numbers, only one "e" sign, one comma OR dot and one + or - sign at the beggining of the string or after the "e" sign. It works for every case, except that it allows the string to start with a comma or dot. I tried to use [^\\.,] and variations and they did in fact work, but in this case, it would also allow to put two +- signs.

How can I make this to work?

scopchanov
  • 7,966
  • 10
  • 40
  • 68

1 Answers1

1

The [-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)? pattern allows the , or . at the start because [-+]? and [0-9]* can match empty strings due to the ? (one or zero occurrences) and * (zero or more occurrences) quantifiers, and then [.,] matches a single occurrence of . or ,. Besides, if the method you are using does not anchor the pattern by default, you also need ^ and $ anchors around the pattern.

I suggest fixing that with

"^[-+]?[0-9]+([.,][0-9]+)?([eE][-+]?[0-9]+)?$"
 ^          ^^^^^^^^^^^^^^                  ^ 

Note you do not need to escape the dot inside a character class, [.] always matches a dot char only.

The [0-9]+([.,][0-9]+)? matches 1+ digits and then an optional sequence of a . or , followed with 1+ digits.

Wiktor Stribiżew
  • 607,720
  • 39
  • 448
  • 563