2013-07-30 7 views
1

Я создал 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 

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

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

Как это можно достичь?

ответ

1

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

[+-]{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})?)$ 

Вы можете проверить это here.

+0

Я могу написать 359.88, но могу написать, например, 6334, но в этом случае десятичная точка не допускается. – Jepessen

+0

@ Jepessen Я думал, что вся идея заключается в поддержке диапазона от -359,99 до 359,99. Почему разрешено 6334? –

+0

Infact Я говорю, что могу писать 6334, но я не должен допускаться. – Jepessen

2

Я создал 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, чтобы убедиться, что вы читаете градусы в этом диапазоне, а не в регулярном выражении.

+0

Я проверяю номера после их вставки, но я хочу сделать это, потому что у меня есть ячейка сетки, в которую я должен поместить это значение, и я должен создать валидатор, чтобы избежать записи пользователем неправильных данных во время записи, например, вставки букв или ввода недопустимых значений. Я думаю, что regexp - хороший инструмент для этого, но, может быть, вы можете предложить что-то лучше? – Jepessen

+0

@ Jepessen. Ну, какая-то проверка, которую вы можете сделать с помощью регулярных выражений, например, для проверки того, что пользователь не имеет алфавита, где требуются только цифры или поле должно начинаться с конкретной буквы, содержат только символы из заданного набора и должна иметь заданную длину. Но некоторые проверки, как я сказал, для определения «диапазона» числа не могут быть выполнены. Для этого вы должны использовать правильную конструкцию языка. BTW, Какой язык вы используете? –

+0

Также см. [This] (http://programmers.stackexchange.com/q/113237/66382) и [это] (http://stackoverflow.com/q/7553722/1679863) сообщение. –

1

Пробег: [+-]?([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 
+0

Кажется, что это не работает. Я могу написать 1, 12, 2. но не 2.4, 200 ecc – Jepessen

+0

Вы пытались привязать регулярное выражение к '^' и '$'? – Phylogenesis

+0

Да, я тоже пробовал. – Jepessen

 Смежные вопросы

  • Нет связанных вопросов^_^