The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Получить все числа из строки"
Вариант для распечатки  
Пред. тема | След. тема 
Форум WEB технологии (Perl)
Изначальное сообщение [ Отслеживать ]

"Получить все числа из строки"  +/
Сообщение от EXA email(ok) on 23-Июн-10, 20:32 
День добрый, про лазил в инете, по пробовал по всякому, но не получается у меня выдрать одним регулярным выражением, все числа из такой строки
POLYGON((8136707.36 6414194.03,8136757.2 6414216.8,8136786.14 6414153.45,8136800.67 6414160.1,8136808.35 6414143.29,8136793.87 6414136.67,8136803.01 6414116.66,8136753.18 6414093.88,8136743.62 6414114.81,8136730.03 6414108.6,8136722.53 6414124.99,8136736.07 6414131.18,8136707.36 6414194.03))
все числа, без скобок и полигона, вот что последние испробовал, но оно не очень, вообще не то

my $digit = '[+-]?\d+\.?\d*\s[+-]?\d+\.?\d*\,';
if ($i =~ /(\w+\(\()($digit{1,})/)
    {
        print "1 $1\n";    # Результат '1'
        print "2 $2\n";    # '2'
        print "3 $3\n";  # '3'
        print "все совпадение $+\n";    # '2'
        print "1,2 $&\n";    # '1 два 2'
        print "все до совпадения $`\n";    # 'Один '
        print "все после совпадения $'\n";    # ' и три 3'
        print "обозначает последнее совпадение $+\n";
   }
Вот такое выдаёт:
1 POLYGON((
2 8136707.36 6414194.03,
3
все совпадение 8136707.36 6414194.03,
1,2 POLYGON((8136707.36 6414194.03,
все до совпадения
все после совпадения 8136757.2 6414216.8,8136786.14 6414153.45,8136800.67 6414160.1,8136808.35 6414143.29,8136793.87 6414136.67,8136803.01 6414116.66,8136753.18 6414093.88,8136743.62 6414114.81,8136730.03 6414108.6,8136722.53 6414124.99,8136736.07 6414131.18,8136707.36 6414194.03))
обозначает последнее совпадение 8136707.36 6414194.03,

Пробовал по разному
if ($i =~ /(\w+\(\()(?=$digit)/)
Ошибки нет, но второе значение пусто.
if ($i =~ /(\w+\(\()(?$digit)/)
То такая ошибка
Sequence (?[...) not recognized in regex; marked by <-- HERE in m/(\w+\(\()(?[ <-- HERE +-]?\d+\.?\d*\s[+-]?\d+\.?\d*\,)/ at ./get_bounds.pl line 41.
if ($i =~ /(\w+\(\()(?$digit+)/)
То такая ошибка
Sequence (?[...) not recognized in regex; marked by <-- HERE in m/(\w+\(\()(?[ <-- HERE +-]?\d+\.?\d*\s[+-]?\d+\.?\d*\,+)/ at ./get_bounds.pl line 41.
В общем я так сказать исчерпался по красивому енто сделать.

$digit{1,} - не могу ни как указать, что он такой шаблон искал столько раз сколько нужно.
Помоги те плиз разобраться.

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Получить все числа из строки"  +/
Сообщение от danunah on 23-Июн-10, 22:27 
а чего бы не заменить запятую на пробел и не использовать split ?
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Получить все числа из строки"  +/
Сообщение от Pahanivo (ok) on 24-Июн-10, 08:33 
>а чего бы не заменить запятую на пробел и не использовать split
>?

да, самое простое в лоб заюзать сплит
только предварительно заменить все нецифровые символы на пробельные, незабыть оставить точку \d\.\d

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Получить все числа из строки"  +/
Сообщение от XAnder (ok) on 24-Июн-10, 09:02 
Выдрать все числа из строки? Нет ничего проще:

$s = ...; # тут наша строка
@a = $s =~ m/[-+]?\d+(?:\.\d+)?/g; # а тут уже список чисел

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Получить все числа из строки"  +/
Сообщение от Недовольный on 24-Июн-10, 10:29 
Поточный парсер быстрее регулярки будет. И понятнее.

Взять всё между внутренними скобками,
split по пробелу,
на каждый элемент split по запятой

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Получить все числа из строки"  +/
Сообщение от XAnder (ok) on 24-Июн-10, 11:13 
>Поточный парсер быстрее регулярки будет.

Согласен. Но если данных немного, то смысла ускорять нет. А если много и скорость важна, то лучше вообще писать это на Сях.

>И понятнее.

А вот тут можно поспорить.

>Взять всё между внутренними скобками,

Это или регексп вида /\(\((.*)\)\)/ или строенная конструкция из index и substr - вряд ли будет способствовать пониманию.

>split по пробелу,
>на каждый элемент split по запятой

Цикл поисков по простым регекспам, построение (пусть и неявное) промежуточных списков. Не думаю, что сильный выигрыш в скорости получится.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "Получить все числа из строки"  +/
Сообщение от EXA email(ok) on 25-Июн-10, 09:44 
Да скорость не нужна совсем.
Спасибо за советы. К счастью, данные выдирать не пришлось, другой запрос бд пошёл. За примеры бавшое спасибо, другим как говориться в помощь.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру