Russian Qt Forum
Ноябрь 26, 2024, 05:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Помогите составить регулярное выражение  (Прочитано 8109 раз)
Andrew12
Гость
« : Январь 21, 2012, 12:05 »

Здравствуй, многоуважаемый All

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

Спасибо.
« Последнее редактирование: Январь 21, 2012, 14:38 от Andrew12 » Записан
SimpleSunny
Гость
« Ответ #1 : Январь 21, 2012, 13:28 »

А какие у вас форматы записи чисел предусмотрены?
Записан
Andrew12
Гость
« Ответ #2 : Январь 21, 2012, 13:44 »

Мне необходимо проверить и получить true в случае если в строке float или double в формате, например, 1234.465 или 28464,28.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Январь 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: раз необходима поддержка запятой, то замени \. на [,.]
« Последнее редактирование: Январь 21, 2012, 17:16 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SimpleSunny
Гость
« Ответ #4 : Январь 21, 2012, 14:07 »

Не валидной будет вполне корректная запись 125.
Записан
Andrew12
Гость
« Ответ #5 : Январь 21, 2012, 14:37 »

Всем спасибо. С задачей пока справился, буду исследовать дальше.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Январь 21, 2012, 15:54 »

Не валидной будет вполне корректная запись 125.
и почему же это вдруг?
Код
Bash
C:\Windows\system32>perl -n -e "print 'ok' if /\d*\.?\d+/"
123
ok
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SimpleSunny
Гость
« Ответ #7 : Январь 21, 2012, 16:40 »

Я про запись, когда точка в конце стоит, если рассматривать как валидную ".235", то "235." ничем не хуже.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Январь 21, 2012, 17:25 »

да, действительно, но технически запись с точкой в конце валидна.

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

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 23.