Добавить две десятичные цифры в регулярное выражение диапазона номеров

Я создал Regexp для проверки направления в градусах между -359 и +359 (с необязательным знаком). Это мое регулярное выражение:

const QString xWindDirectionPattern("[+-]{0,1}([0-9]{1,2}|[12][0-9]{2}|3[0-5][0-9])");

Теперь я хочу добавить два десятичных числа, чтобы записать числа от -359,99 до +359,99. Я пробовал добавить что-то вроде \. [0-9] {1,2} | [0-9] {1,3}, но это не работает.

Я хотел бы иметь дополнительную десятичную точку, чтобы иметь

23.3   valid
23.33  valid
23     valid
23.333 not valid

Я читал некоторые другие вопросы, например этот, но я не удалось изменить пример, чтобы он соответствовал диапазону номеров, как в моем случае. Как добиться такого результата?

Заранее благодарим за ответы.

Как этого добиться?


person Jepessen    schedule 30.07.2013    source источник


Ответы (3)


Я создал Regexp для проверки направления в градусах между -359 и +359.

Нет, вы не можете. Вы не должны. Вы используете неправильный инструмент. Regex не может выполнять проверки, требующие углубления в семантику символов.

Regex может только обрабатывать и сопоставлять текст, но не может определить, что они на самом деле означают. В основном Regex хороши для синтаксического анализа обычного языка и плохи почти для всего остального.

Например:

  • Регулярное выражение может соответствовать 3 цифрам, но было бы крайне непрактично использовать его для сопоставления 3 цифр, попадающих в диапазон - [259, 634]. Для этого вам нужно знать значение каждой отдельной цифры в этом номере.
  • Регулярное выражение может соответствовать шаблону даты, например - \d\d/\d\d/\d\d, но не может определить, какая часть - date, а какая - month.
  • Точно так же он может найти вам два числа x и y, но не может определить, x < y или нет.

Задача, описанная выше, требует от вас понимания смысла текста. Regex не может этого сделать.

Ну, конечно, вы наверняка придумали регулярное выражение, но, как видите, оно очень негибкое. Небольшое изменение в ваших требованиях приведет к тому, что вы оба - регулярное выражение и вы.

Вам лучше использовать соответствующие языковые функции - такие конструкции, как if-else, чтобы убедиться, что вы читаете градусы в этом диапазоне, а не регулярное выражение.

person Rohit Jain    schedule 30.07.2013
comment
Я проверяю числа после их вставки, но я хочу сделать это, потому что у меня есть ячейка сетки, в которую я должен поместить это значение, и я должен создать валидатор, чтобы избежать того, чтобы пользователь записывал неправильные данные во время записи, например, вставляя буквы или введя недопустимые значения. Я думаю, что регулярное выражение - хороший инструмент для этого, но, может быть, вы можете предложить что-нибудь получше? - person Jepessen; 30.07.2013
comment
@Jepessen. Что ж, какую-то проверку вы можете выполнить с помощью регулярного выражения, например, для проверки того, что у пользователя нет алфавита, где требуются только цифры, или поле должно начинаться с определенной буквы, содержать только символы из заданного набора и должна быть определенной длины. Но некоторая проверка, как я уже сказал, для определения range числа не может быть выполнена. Для этого вам следует использовать подходящую языковую конструкцию. Кстати, какой язык вы используете? - person Rohit Jain; 30.07.2013
comment
Также см. this и это сообщение. - person Rohit Jain; 30.07.2013

Ты можешь сделать это:

[+-]{0,1}((?:[0-9]{1,2}|[12][0-9]{2}|3[0-5][0-9])(?:\.[0-9]{1,2})?)

Это позволит поставить десятичную точку с одной или двумя цифрами. Вероятно, вы также захотите использовать начальную и конечную привязки (^ / $), чтобы гарантировать, что в вашей строке нет символов, кроме этого шаблона, без этого 23.333 будет разрешено, потому что 23.33 соответствует приведенному выше шаблону:

^[+-]{0,1}((?:[0-9]{1,2}|[12][0-9]{2}|3[0-5][0-9])(?:\.[0-9]{1,2})?)$

Вы можете проверить это здесь.

person p.s.w.g    schedule 30.07.2013
comment
Я могу написать 359,88, но могу написать, например, 6334, но в этом случае нельзя использовать десятичную точку. - person Jepessen; 30.07.2013
comment
@Jepessen Я думал, что вся идея заключалась в том, чтобы поддерживать диапазон от -359,99 до 359,99. Почему 6334 было разрешено? - person p.s.w.g; 30.07.2013
comment
На самом деле я говорю, что могу написать и 6334, но мне нельзя позволять. - person Jepessen; 30.07.2013
comment
@Jepessen Хорошо, спасибо, что прояснили это. Вы, вероятно, видите это, потому что это соответствует 63 внутри 6334. См. Мое примечание об использовании начальной и конечной привязок (^ / $). Мой второй шаблон вообще не допускал 6334. - person p.s.w.g; 30.07.2013
comment
Я только что пробовал, это позволяет мне записывать недопустимые значения, такие как 99999. Я немного проверил, и если я напишу значение в моем диапазоне, оно работает хорошо, но я также могу записать значение вне диапазона, и в этом случае десятичные дроби не допускаются. - person Jepessen; 30.07.2013
comment
Вы используете якоря начала / конца, как я предложил? У меня вроде нормально работает. Проверьте это здесь: regexpal.com/ - person p.s.w.g; 30.07.2013
comment
Не знаю, что сказать ... может проблема связана с QRegExp и QRegExpValidator? - person Jepessen; 30.07.2013
comment
@Jepessen Это возможно. Я не очень знаком с этим конкретным движком / валидатором регулярных выражений. Согласно это предполагаемые привязки. Возможно, он просто запутался и считает его «промежуточным». - person p.s.w.g; 30.07.2013
comment
Ok. Я попробую проверить это на форуме Qt, а затем вернусь сюда, если будут какие-нибудь новости. - person Jepessen; 31.07.2013

Попробуйте [+-]?([1-9]\d?|[12]\d{2}|3[0-5]\d)(\.\d{1,2})?.

[+-]?          Optional Sign
[1-9]\d?       1 or 2 digit number
[12]\d{2}      100 to 299
3[0-5]\d       300 to 359
(\.\d{1,2})?   Optional decimal point followed by 1 or two digits
person Phylogenesis    schedule 30.07.2013
comment
Вроде не работает. Я могу написать 1, 12, 2. но не 2,4, 200 и т.д. - person Jepessen; 30.07.2013
comment
Помещение регулярного выражения в Regex Pal, он соответствует всему, что я могу на него бросить. - person Phylogenesis; 30.07.2013
comment
Не знаю, что сказать ... может проблема связана с QRegExp и QRegExpValidator? - person Jepessen; 30.07.2013
comment
Это возможно, судя по всему, у вас также есть проблемы с регулярным выражением p.s.w.g. - person Phylogenesis; 30.07.2013
comment
Ok. Я попробую проверить это на форуме Qt, а затем вернусь сюда, если будут какие-нибудь новости. - person Jepessen; 31.07.2013