Проверка степени и символа (регулярное выражение)

Мне нужно проверить данную строку из QLineEdit. Истинный ввод: 355,12 ° L

Двойное число должно быть между 0-360, а последний символ должен быть L или R. Я использовал маску QString для степени (°) и этот пример для 360, но я не могу использовать маску и QDoubleValidator вместе. Похоже, только QRegExp может решить эту проблему.

Моя строка маски:

">999.99°A"

person waaz    schedule 09.07.2014    source источник


Ответы (2)


((?:[012]?[0-9]{1,2}|3(?:[0-5][0-9]|60))(?:\.[0-9]{0,2})?)°[LR]

Попробуйте приведенный выше шаблон. Я не уверен, поддерживает ли qregexp шаблоны (?:) или нет.

person hjpotter92    schedule 09.07.2014

Шаблон, который я предлагаю, преднамеренно длинный и избыточный, чтобы быть максимально эффективным (цель состоит в том, чтобы уменьшить максимально возможную работу механизма регулярных выражений):

QRegExp exp("^(?:[1-2][0-9]{0,2}(?:\\.[0-9]{1,2})?|3(?:[0-5]?[0-9]?(?:\\.[0-9]{1,2})?|60(?:\\.00?)?)|[4-9][0-9]?(?:\\.[0-9]{1,2})?|0(?:\\.[0-9]{1,2})?)° ?[LR]$");
lineEdit_->setValidator(new QRegExpValidator(exp, this));

Этот шаблон запрещает начальные нули для десятков и сотен и делает необязательными десятичные дроби, которые ограничены двумя цифрами (таким образом, конечная или ведущая точка не разрешены) Допускается необязательный пробел между ° и L (или R)

Теперь, если вам нужен шаблон, который точно соответствует маске 999.99°A (т.е. начальные нули верны, нигде нет необязательных пробелов, всегда есть три цифры и два десятичных знака), вы можете использовать этот шаблон вместо предыдущего:

^(?:[0-2][0-9]{2}\\.[0-9]{2}|3(?:[0-5][0-9]\\.[0-9]{2}|60\\.00))°[LR]$
person Casimir et Hippolyte    schedule 09.07.2014
comment
Вы, вероятно, тоже это заметили: мне кажется, что есть предвзятость к коротким регулярным выражениям, с идеей, что чем короче, тем лучше. И, как вы знаете, это может быть правдой, но также и очень ложным... И это может быть обескураживающим, поскольку вы знаете, что если вы используете atomics и т. д., будет выбрана более короткая и медленная версия. :) Итак, +1 за эту невознагражденную работу. - person zx81; 11.07.2014
comment
@zx81: Спасибо за поддержку. Главное, чтобы этот паттерн где-то резонировал. - person Casimir et Hippolyte; 12.07.2014