Разбор строки
От: Аноним  
Дата: 06.10.04 07:55
Оценка:
Привет All.
Помогите с разбором строки.

Есть строка вида:

L3<набор символов>L*L3<набор символов>L*L3<набор символов>

Необходимо получить токены находящиеся между L3 и L* и последнюю часть. Чем лучше воспользоваться?
Если возможно небольшой примерчик.
Заранее огромное спасибо.
Re: Разбор строки
От: Chipset2k Россия http://merlinko.com
Дата: 06.10.04 08:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет All.

А>Помогите с разбором строки.

А>Есть строка вида:


А>L3<набор символов>L*L3<набор символов>L*L3<набор символов>


А>Необходимо получить токены находящиеся между L3 и L* и последнюю часть. Чем лучше воспользоваться?

А>Если возможно небольшой примерчик.
А>Заранее огромное спасибо.
Раз у тебя это известно, грех не воспользоваться stprintf.
А именно:
stprintf(inputStr,"L3<%s>L*L3<%s>L*L3<%s>",s1,s2,s3);
собственно s1,s2,s3 уже парсишь
можешь воспользоваться тем же бустом или свой написать
"Всё что не убивает нас, делает нас сильнее..."
Re[2]: Разбор строки
От: Аноним  
Дата: 06.10.04 08:39
Оценка:
Здравствуйте, Chipset2k, Вы писали:

C>Здравствуйте, Аноним, Вы писали:


А>>Привет All.

А>>Помогите с разбором строки.

А>>Есть строка вида:


А>>L3<набор символов>L*L3<набор символов>L*L3<набор символов>


А>>Необходимо получить токены находящиеся между L3 и L* и последнюю часть. Чем лучше воспользоваться?

А>>Если возможно небольшой примерчик.
А>>Заранее огромное спасибо.
C>Раз у тебя это известно, грех не воспользоваться stprintf.
C>А именно:
C>stprintf(inputStr,"L3<%s>L*L3<%s>L*L3<%s>",s1,s2,s3);
C>собственно s1,s2,s3 уже парсишь

Не подойдет. Количество подстрок не известно.

C>можешь воспользоваться тем же бустом или свой написать


А примерчик с Boost-ом можно.
Re: Разбор строки
От: Phoenickx  
Дата: 06.10.04 12:02
Оценка:
Здравствуйте, Аноним, функция strtok не поможет?она позволяет задать во втором параметре строку из разделяющих лексем
Re[2]: Разбор строки
От: Аноним  
Дата: 06.10.04 12:14
Оценка:
Здравствуйте, Phoenickx, Вы писали:

P>Здравствуйте, Аноним, функция strtok не поможет?она позволяет задать во втором параметре строку из разделяющих лексем


Не подойдет. Мне надо что бы в качестве разделителя были строки а не символы.
Re: Разбор строки
От: korzhik Россия  
Дата: 06.10.04 14:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть строка вида:

А>L3<набор символов>L*L3<набор символов>L*L3<набор символов>
А>Необходимо получить токены находящиеся между L3 и L* и последнюю часть. Чем лучше воспользоваться?
А>Если возможно небольшой примерчик.

вот тебе код
когда писал торопился, возможны баги, проверь.
#include <cstring>

#include <iostream>
#include <string>

class tokenizer
{
    private:  // noncopyable
        tokenizer(const tokenizer&);
        tokenizer& operator=(const tokenizer&);
    public:
        struct token
        {
            char const * ptr;
            unsigned     len;
        };

    public:
        tokenizer(char const * sep) : // sep := "<sep1>\x0<sep2>\x0<sep3>\x0\x0"
            m_src_string(0),
            m_start(0),
            m_separators(sep)
        {
        }

        void set_str(char const * str ) 
        { 
            m_src_string = str; 
            m_start = 0;
        }

        bool next(); 

        token current_token() const 
        {
            return m_token;
        }
    
    private:
        char const * check_sep(char const * str) const
        {
            char const * pstr = m_separators;

            while (unsigned len = std::strlen(pstr))
            {
                if (std::strncmp(str, pstr, len) == 0)
                {
                    return str + len;
                }
                pstr += len + 1;
            }
            return str;
        }
    
    private:
        char const * m_src_string;
        int             m_start;
        token         m_token;
        char const * m_separators;
};

//-----------------------------------------------------------------------
bool tokenizer::next()
{
    m_token.ptr = 0;
    m_token.len = 0;

    if (m_src_string == 0 || m_start == -1) 
        return false;

    const char *pstr = m_src_string + m_start;

    if (*pstr == 0) 
    {
        m_start = -1;
        return false;
    }

    unsigned count = 0;

    while (*pstr)
    {
        char const * p = pstr;

        pstr = check_sep(pstr);

        if (p != pstr)
        {
            if (count == 0)
            {
                m_start += pstr - p;
                continue;
            }

            m_token.ptr = m_src_string + m_start;
            m_token.len = count;

            m_start += count + (pstr - p);

            return true;
        }
        else
        {
            ++pstr;
            ++count;
        }
    }

    m_token.ptr = m_src_string + m_start;
    m_token.len = count;
    
    m_start += count;

    return true;
}

//-----------------------------------------------------------------------
int main()
{
    tokenizer tok("L3\x0L*\x0\x0");
    tok.set_str("L*HelloL3,L*lazyL3anonymL*:)");

    while (tok.next())
    {
        tokenizer::token tk = tok.current_token();

        std::cout << std::string(tk.ptr, tk.len) << std::endl;
    }
}
Re[3]: Разбор строки
От: Phoenickx  
Дата: 06.10.04 18:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не подойдет. Мне надо что бы в качестве разделителя были строки а не символы.

так может задать составляющие разделитель символы,а потом отсеивать пустые подстроки?..
Я к сожалению пока не могу сам проверить
Re: Разбор строки
От: Alex Alexandrov США  
Дата: 06.10.04 20:24
Оценка:
Здравствуйте, Аноним, Вы писали:

> Привет All.

> Помогите с разбором строки.
>
> Есть строка вида:
>
> L3<набор символов>L*L3<набор символов>L*L3<набор символов>
>
> Необходимо получить токены находящиеся между L3 и L* и последнюю часть.
> Чем лучше воспользоваться? Если возможно небольшой примерчик.
> Заранее огромное спасибо.

Регулярные выражения спасут мир! Вот пример. Правда на perl. На С++ можно использовать boost::regex.

$data = "L3<set1>L*L3<set2>L*L3<set3>";
while ($data =~ /L3(.*?)(L|$)/g) {
print "$1\n";
}


-- Всего хорошего!
-- Alex Alexandrov, e-mail: alex_alexandrov(at)fromru(dot)com
Posted via RSDN NNTP Server 1.9 gamma
It's kind of fun to do the impossible (Walt Disney)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.