The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
regex, извлечь строку, !*! boost, 18-Янв-12, 19:05  [смотреть все]
Есть строка вида .price+10*200+.summ45*.total

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

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

  • regex, извлечь строку, !*! skb7, 01:07 , 19-Янв-12 (1)
    > Есть строка вида .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;
    }

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

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

    • regex, извлечь строку, !*! Anonymouse, 03:35 , 19-Янв-12 (3)
      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

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

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

    > .price
    > .summ45
    > .total




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

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