Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: RegExp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.66/32: Рейтинг темы: голосов - 32, средняя оценка - 4.66
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
1

Регулярные выражения - вещественные числа

21.04.2011, 18:58. Просмотров 5882. Ответов 18
Метки нет (Все метки)

здраствуйте.
как с помощью регулярки найти вещественное число в строке?
спасибо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2011, 18:58
Ответы с готовыми решениями:

ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ?
Здравствуйте! Решил реализовать ЧПУ на своем сайте. Первый этап это замена всех...

Регулярные выражения: округление дробного числа до N знаков
Люди добрые помогите с рег выражением нужно из 0.146505376344 вот такой цифры...

Регулярные выражения
Помогите пожалуйста подобрать регулярное выражение, чтобы заменять $s =...

Регулярные выражения.
Нужно вытащить все, находящееся между "мп3-дисков" и...

Регулярные выражения
Добрый день! Подскажите какой будет шаблон паттерн для функций preg_replace,...

18
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
21.04.2011, 19:15 2
Допустимые варианты:
  • 1
  • 1.
  • .2
  • 1.2
Во всех этих случаях допустима экспоненциальная часть
  • e3
  • E-3
  • e+3
/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?/
PHP
1
2
3
4
if (preg_match_all('/(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][-+]?\\d+)?/', $string, $matches)) {
    print_r($matches);
}
else echo 'fail';
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
21.04.2011, 21:49  [ТС] 3
думал проще получится. и 1 не допустимо это целое.
еще вопрос как парсить такое:
var.1
var.1.1
var.1.1.1
и так до бесконечности?

Добавлено через 36 минут
еще вопрос. есть выражение
a = 1
как парсить регуляркой так чтобы и парсилось и такое
a=1
a =1
a= 1
a = 1
и т.д,?
0
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
22.04.2011, 16:45 4
Цитата Сообщение от vvsh Посмотреть сообщение
и 1 не допустимо это целое.
Тогда давайте подробнее рассказывайте. Может у Вас там еще 0377 - это восмиричное и 0x7F - это шестнадцатиричное. Откуда мне все это предугадать? Я же не телепат.


Цитата Сообщение от vvsh Посмотреть сообщение
еще вопрос как парсить такое:
var.1
var.1.1
var.1.1.1
А оператор . у Вас есть?

Цитата Сообщение от vvsh Посмотреть сообщение
еще вопрос. есть выражение
a = 1
как парсить регуляркой так чтобы и парсилось и такое
a=1
a =1
a= 1
a = 1
и т.д,?
Пробельные символы (все или только линейные, в зависимости от ЯП) просто пропускете и все.

Насколько я понял, Вы хотите входной поток плэинтекста разбить на поток токенов? Надо для каждого типа токена составить отдельное правильное адекватное и оптимальное выражение, а затем все выражения в нужном порядке расставить (чтобы, например, оператор == был наиболее приоритетен, чем = ).
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
22.04.2011, 17:13  [ТС] 5
скажу так. это ЯП свой. парсится построчно, там определенный синтаксис и никакого приоритета.
0
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
22.04.2011, 17:38 6
Цитата Сообщение от vvsh Посмотреть сообщение
это ЯП свой. парсится построчно
Значит символы новой строки - это по сути тоже токен, который тоже надо учитывать (как ; в других языках).
Цитата Сообщение от vvsh Посмотреть сообщение
там определенный синтаксис и никакого приоритета
Здесь речь сейчас идет о приоритете токенов как таковых, чтобы, например, комментарий
PHP
1
  // comment
обрабатывался именно как комментарий (два слеша вместе), а не как два подряд идущих оператора деления. Т.е. здесь // более риоритетен, чем / .

В общем, как я уже и сказал, надо для начала с возможными токенами определиться, а потом уже изобретать парсер для них.
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
22.04.2011, 17:49  [ТС] 7
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Значит символы новой строки - это по сути тоже токен, который тоже надо учитывать (как ; в других языках).

Здесь речь сейчас идет о приоритете токенов как таковых, чтобы, например, комментарий
PHP
1
  // comment
обрабатывался именно как комментарий (два слеша вместе), а не как два подряд идущих оператора деления. Т.е. здесь // более риоритетен, чем / .

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

так и парситься построчно. сначала разбивается на строки потом парсит по одной.
комментарий так и парсится \/\/(.*)

существует несколько вариантов строк
1. var = expression
2. var = (int|double|string)
3. function(args)

если определяется что первый вариант то начинает парсится expression там
1. function(arg)
2. {}
3. var.1.1.1

вот нужно сначала понять с помощью регулярки что первое условие а там может быть
a=1
a =1
a= 1
a = 1
и т.д
или третий вариант expression:
var.1
var.1.1
var.1.1.1
0
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
22.04.2011, 17:56 8
Цитата Сообщение от vvsh Посмотреть сообщение
существует несколько вариантов строк
1. var = expression
2. var = (int|double|string)
3. function(args)
1 и 2 понятно.
3 - декларация функции или просто вызов?

Цитата Сообщение от vvsh Посмотреть сообщение
если определяется что первый вариант то начинает парсится expression там
1. function(arg)
2. {}
3. var.1.1.1
1 понятно - вызов функции.
2 и 3 не понятно.

Может, лучше на примерах?
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
22.04.2011, 18:08  [ТС] 9
{} - массив
var.1.1.1 - элементы массива.
0
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
22.04.2011, 18:15 10
Цитата Сообщение от vvsh Посмотреть сообщение
{} - массив
А внутри, стало быть, опционально такие же expression'ы через запятую, причем expression рекурсивное получается ( {1,f(),{var,{42},20},3,{},4} ).

Цитата Сообщение от vvsh Посмотреть сообщение
var.1.1.1 - элементы массива.
Вместо чисел могут быть expression? ( var[i] )
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
22.04.2011, 18:48  [ТС] 11
Цитата Сообщение от Vovan-VE Посмотреть сообщение
А внутри, стало быть, опционально такие же expression'ы через запятую, причем expression рекурсивное получается ( {1,f(),{var,{42},20},3,{},4} ).


Вместо чисел могут быть expression? ( var[i] )

нет это массив только так {{1, 2, 3}, {4, 5, 6}}, может быть {{var1, var2, var3}, {4, 5}}
но все переменные обрабатываются отдельно и преобразуются в числа.
и все var.i.j.k.l.m тоже обрабатываются сразу.
0
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
22.04.2011, 18:58 12
Цитата Сообщение от vvsh Посмотреть сообщение
нет это массив только так {{1, 2, 3}, {4, 5, 6}}, может быть {{var1, var2, var3}, {4, 5}}
Но тогда все равно неоднородность не исключена. var1 может содержать 42, а var2 - {}. Так что, все-таки, рекурсивно.

И последнее - строки. Кавычки, апострофы, экранирование... Что как?
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
22.04.2011, 19:23  [ТС] 13
строки пока не рассматриваем.
с double я разобрался.
теперь нужнр то распарсить.
0
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
22.04.2011, 19:51 14
На псевдоRegExp'ах у меня получилась вот такая терминология.
Код
code      :: (<statement>?<eol>)*
statement :: <assign>|<func>
assign    :: <var>=<expr>
expr      :: <double>|<int>|<string>|<array>|<func>|<arr_ac>
func      :: <name>\(<args>?\)
array     :: {<args>?}
arr_ac    :: <var>(\.(<uint>|<var>))*
args      :: <expr>(,<expr>)*
var       :: <name>
int       :: [-+]?\d+
uint      :: \d+
double    :: [-+]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)
string    :: 
name      :: [a-zA-Z_][a-zA-Z_0-9]*
eol       :: \r\n?|\n
Вся сложность во рекурсивном expr . Я считаю, что каждую строку кода надо сначала просто делить на более-менее неделимые части, а потом уже эти части изучать последовательно.

Добавлено через 2 минуты
Проще всего распознать тип строки: либо функция, либо присваивание. А дальше начинается пляска вокруг expr .

Добавлено через 19 минут
Цитата Сообщение от vvsh Посмотреть сообщение
и все var.i.j.k.l.m тоже обрабатываются сразу.
Вот с этим еще потенциально могут проблемы в будущем возникнуть. В такой реализации невозможно обратиться к a[b[c]][d] .
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
22.04.2011, 20:23  [ТС] 15
Код
arr_ac    :: <var>(\.(<uint>|<var>))*
такой парсинг не подходит, так как учитывает даже такое var.1.2=3.4.3

а так для double не подойдет?
-?\d+(?:E|\.){1}\d*e?-?\d*

я вообще не ожидал никакой помощи. спасибо огромное
0
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
22.04.2011, 20:30 16
Цитата Сообщение от vvsh Посмотреть сообщение
а так для double не подойдет?
-?\d+(?:E|\.){1}\d*e?-?\d*
[-+]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)

Включает варианты c учетом необязательных унарных плюсов/минусов у мантиссы и экспоненты:
1.
.2
1.2
1.e3
.2e3
1.2e3
1e3
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
22.04.2011, 20:36  [ТС] 17
Цитата Сообщение от Vovan-VE Посмотреть сообщение
[-+]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)

Включает варианты c учетом необязательных унарных плюсов/минусов у мантиссы и экспоненты:
1.
.2
1.2
1.e3
.2e3
1.2e3
1e3
спасибо. у меня с регулярными выражениями явно проблемы где можно лучше о них узнать? может книги какие есть
0
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
22.04.2011, 20:41 18
Цитата Сообщение от vvsh Посмотреть сообщение
где можно лучше о них узнать? может книги какие есть
Имхо, документация + практика.
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
22.04.2011, 20:52  [ТС] 19
ясно.
вот еще
"function ([a-zA-Z_][a-zA-Z_0-9]*)\((.*)\) ?\{(.*)\}"
определение функции, такой вариант не подходит так как в фигурных скобках может быть несколько строк. что делать?
0
22.04.2011, 20:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2011, 20:52

регулярные выражения
Здравствуйте. Нечто для меня странное. Есть скрипт который юзает регулярные...

Регулярные выражения
Почему не работает? Где собака зарыта, помогите отрыть :) &lt;?php header...

Регулярные выражения
Никак не получается извлечь из такой строки: &quot;|0|1||0|2||0|3&quot; вот, что:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru