Есть строка вида .price+10*200+.summ45*.totalНеобходимо извлечь все переменные, т.е. на выходе чтоб был массив
.price
.summ45
.totalТ.е. шаблон ".[любыебуквыиличисла]"
Не понимаю, как указать, чтобы он брал только символы [0-9a-zA-z]
> Есть строка вида .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;
}
Да, я там сделал чтобы первый символ был обязательно буквой, ведь для переменных принят именно такой синтаксис. Шаблон по вашему вопросу будет "(\\.\\w+)".P.S. Для облегчения написания подобных строк, чтобы не экранировать каждый раз обратный слеш, можете применить raw string literals, ввели в новом стандарте, C++11.
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
>[оверквотинг удален]
>> 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 '^\.'
> Можно обойтись без нажатия ENTER:_только_ в GNU sed. А предложенный сверху вариант - пойдёт везде.
> Есть строка вида .price+10*200+.summ45*.total
> Необходимо извлечь все переменные, т.е. на выходе чтоб был массив|egrep -o "\.[a-z][a-z0-9]*"
или
|egrep -o "\.[^+=* ]+" ,,,если лениво-быстро.> .price
> .summ45
> .total