Russian Qt Forum

Qt => Общие вопросы => Тема начата: Andrew12 от Январь 21, 2012, 12:05



Название: [РЕШЕНО] Помогите составить регулярное выражение
Отправлено: Andrew12 от Январь 21, 2012, 12:05
Здравствуй, многоуважаемый All

Никак не покоряются регулярные выражения. Помогите составить, соответствующее формату целого и дробного числа.
Может также кто-нить сбросит ссылку на внятное объяснение как составлять regexp.

Спасибо.


Название: Re: Помогите составить регулярное выражение
Отправлено: SimpleSunny от Январь 21, 2012, 13:28
А какие у вас форматы записи чисел предусмотрены?


Название: Re: Помогите составить регулярное выражение
Отправлено: Andrew12 от Январь 21, 2012, 13:44
Мне необходимо проверить и получить true в случае если в строке float или double в формате, например, 1234.465 или 28464,28.


Название: Re: Помогите составить регулярное выражение
Отправлено: kambala от Январь 21, 2012, 13:45
нагуглить такие простые регэкспы должно быть несложно ;)

с целыми числами всё просто: \d+ Объяснение: \d означает любую цифру; + - повторение предыдущего символа (т.е. любой цифры) не менее 1 раза, т.е. валидными будут 1, 5, 0, 12, 34545, ... . если окружить этот регэксп круглыми скобками, то число сохранится в переменной $1 или \1 или в QRegExp::cap(1) (всё зависит от того, где ты их используешь).

с дробными уже немного посложнее. \d*\.?\d+ Объяснение: * - повторение предыдущего символа (т.е. любой цифры) не менее 0 раз, т.е. в этом месте цифры вообще могут отсутствовать; \. - точка (\ перед ней необходим, т.к. в регэкспах просто символ . означает любой символ), ? - предыдущий символ (точка) может присутствовать, а может и нет (в этом месте валидными строками уже будут 1., 1, 12, 345., ., пустая); ну и последняя часть уже известна. таким образом, валидными строками будут 3, 3.5, 3.456, 1234, 456.5, 345.567, .1, .456 (когда перед точкой нет цифры, это подразумевает 0 целых)

в примерах не учитывается знак перед числом. если это нужно, то просто допиши в начало [-+]? - квадратные скобки означают вхождение любого из символов внутри них, ну а ? я уже описал.

как научиться им: говорят книга Фридла очень хорошая, но в приципе хелпа по QRegExp/мана в юниксовой справке/документации Перла должно быть достаточно.

edit: раз необходима поддержка запятой, то замени \. на [,.]


Название: Re: Помогите составить регулярное выражение
Отправлено: SimpleSunny от Январь 21, 2012, 14:07
Не валидной будет вполне корректная запись 125.


Название: Re: Помогите составить регулярное выражение
Отправлено: Andrew12 от Январь 21, 2012, 14:37
Всем спасибо. С задачей пока справился, буду исследовать дальше.


Название: Re: [РЕШЕНО] Помогите составить регулярное выражение
Отправлено: kambala от Январь 21, 2012, 15:54
Не валидной будет вполне корректная запись 125.
и почему же это вдруг?
Код
Bash
C:\Windows\system32>perl -n -e "print 'ok' if /\d*\.?\d+/"
123
ok


Название: Re: [РЕШЕНО] Помогите составить регулярное выражение
Отправлено: SimpleSunny от Январь 21, 2012, 16:40
Я про запись, когда точка в конце стоит, если рассматривать как валидную ".235", то "235." ничем не хуже.


Название: Re: [РЕШЕНО] Помогите составить регулярное выражение
Отправлено: kambala от Январь 21, 2012, 17:25
да, действительно, но технически запись с точкой в конце валидна.

если же такое нельзя, тогда \d*\.?\d+(?!.) сделает дело (при условии поддержки look-ahead assertions естественно).

либо, если приемлемо, можно использовать ^\d*\.?\d+$ (одна строка - одно число).