The OpenNET Project / Index page

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

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

"regex, извлечь строку"  +/
Сообщение от boost on 18-Янв-12, 19:05 
Есть строка вида .price+10*200+.summ45*.total

Необходимо извлечь все переменные, т.е. на выходе чтоб был массив
.price
.summ45
.total

Т.е. шаблон  ".[любыебуквыиличисла]"  
Не понимаю, как указать, чтобы он брал только символы [0-9a-zA-z]

Ответить | Правка | Cообщить модератору

Оглавление

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


1. "regex, извлечь строку"  +/
Сообщение от skb7 (ok) on 19-Янв-12, 01:07 
> Есть строка вида .price+10*200+.summ45*.total
> Необходимо извлечь все переменные, т.е. на выходе чтоб был массив
> .price
> .summ45
> .total
> Т.е. шаблон  ".[любыебуквыиличисла]"
> Не понимаю, как указать, чтобы он брал только символы [0-9a-zA-z]

#include <cstdlib>
#include <iostream>
#include <string>
#include <boost/regex.hpp>

int main()
{
    // Интересующее тебя выражение; \w - это любая цифра, буква или '_'
    boost::regex expression("(\\.[a-zA-Z]\\w*)");
    // Твоя строка
    std::string s(".price+10*200+.summ45*.total");
    
    // Переменные для поиска
    std::string::const_iterator start = s.begin();
    std::string::const_iterator end = s.end();
    boost::match_results<std::string::const_iterator> what;
    boost::match_flag_type flags = boost::match_default;

    // Поиск
    while (boost::regex_search(start, end, what, expression, flags)) {
        // Можешь формировать здесь массив найденных строк
        std::string findedString(what[1].first, what[2].second);
        std::cout << findedString << std::endl;
        
        // Обновление позиции поиска
        start = what[0].second;
        
        // Обновление флагов
        flags |= boost::match_prev_avail;
        flags |= boost::match_not_bob;
    }
        
    return EXIT_SUCCESS;
}

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "regex, извлечь строку"  +/
Сообщение от skb7 (ok) on 19-Янв-12, 01:13 
Да, я там сделал чтобы первый символ был обязательно буквой, ведь для переменных принят именно такой синтаксис. Шаблон по вашему вопросу будет "(\\.\\w+)".

P.S. Для облегчения написания подобных строк, чтобы не экранировать каждый раз обратный слеш, можете применить raw string literals, ввели в новом стандарте, C++11.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "regex, извлечь строку"  +/
Сообщение от Anonymouse on 19-Янв-12, 03:35 
ProgrammerZZZ ... :)

The admin way:

> echo ".price+10*200+.summ45*.total " | sed -n 's/\.[a-z][a-zA-Z0-9]*/\\

&\\
/gp' | grep '^\.'
.price
.summ45
.total
>

PS: Please be aware: you have to actually type 'Enter' after \\ in string 1 and 2.

PPS: Or use perl

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "regex, извлечь строку"  +/
Сообщение от skb7 (ok) on 19-Янв-12, 04:21 
>[оверквотинг удален]
>> echo ".price+10*200+.summ45*.total " | sed -n 's/\.[a-z][a-zA-Z0-9]*/\\
> &\\
> /gp' | grep '^\.'
> .price
> .summ45
> .total
>>
> PS: Please be aware: you have to actually type 'Enter' after \\
> in string 1 and 2.
> PPS: Or use perl

Можно обойтись без нажатия ENTER:

>> echo '.price+10*200+.summ45*.total' | sed -n 's/\.[a-zA-Z]\w*/\n&\n/gp' | grep '^\.'

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "regex, извлечь строку"  +/
Сообщение от anonimouse on 19-Янв-12, 06:21 
> Можно обойтись без нажатия ENTER:

_только_ в GNU sed. А предложенный сверху вариант - пойдёт везде.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "regex, извлечь строку"  +/
Сообщение от Andrey Mitrofanov on 19-Янв-12, 09:47 
> Есть строка вида .price+10*200+.summ45*.total
> Необходимо извлечь все переменные, т.е. на выходе чтоб был массив

|egrep -o "\.[a-z][a-z0-9]*"
   или
|egrep -o "\.[^+=* ]+"   ,,,если лениво-быстро.

> .price
> .summ45
> .total

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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




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

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