Чтение из istream до тех пор, пока последовательность символов не будет сопоставлена ​​[duplicate]

Я использовал эту библиотеку cloning и нашел ее весьма полезной. Поскольку у него было несколько ограничений (мне нужен был более тонкий контроль над процессом клонирования: какое поле, в каком контексте и насколько глубоко нужно клонировать и т. Д.), Я создал расширенную версию. Вы управляете клонированием полей, аннотируя их в классе сущностей.

Чтобы получить его вкус, вот пример класса:

public class CloneMePlease {
    @Clone(Skip.class)
    String id3 = UUID.randomUUID().toString();

    @Clone(Null.class)
    String id4 = UUID.randomUUID().toString();

    @Clone(value = RandomUUID.class, groups=CustomActivationGroup1.class)
    String id5 = UUID.randomUUID().toString();

    @Clone.List({
            @Clone(groups=CustomActivationGroup2.class, value=Skip.class),
            @Clone(groups=CustomActivationGroup3.class, value=Copy.class)})
    Object activationGroupOrderTest = new Object();

    @Clone(LongIncrement.class)
    long version = 1l;

    @PostClone
    private void postClone(CloneMePlease original, @CloneInject CloneInjectedService service){
         //do stuff with the original source object in the context of the cloned object
         //you can inject whatewer service you want, from spring/guice to perform custom logic here
    }
}

Подробнее здесь: https://github.com/mnorbi/fluidity-cloning

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

11
задан Martin 9 August 2009 в 21:38
поделиться

4 ответа

Похоже, вам нужно будет написать свой собственный TokenizerFunction , чтобы сделать то, что вы хотите.

0
ответ дан Adam Batkin 26 August 2018 в 14:47
поделиться
  • 1
    Понимаю. Я надеялся, что будет что-то готовое, но я предполагаю, что я слишком много надеялся. – Martin 9 August 2009 в 22:01

Я знаю, что тема довольно старая, но она показана в верхних ссылках в google при поиске «boost tokenizer по строке»

, поэтому я добавлю свой вариант TokenizerFunction, на всякий случай:

class FindStrTFunc
{
public:
    FindStrTFunc() : m_str(g_dataSeparator)
    {
    }

    bool operator()(std::string::const_iterator& next,
        const std::string::const_iterator& end, std::string& tok) const
    {
        if (next == end)
        {
            return false;
        }
        const std::string::const_iterator foundToken =
            std::search(next, end, m_str.begin(), m_str.end());
        tok.assign(next, foundToken);
        next = (foundToken == end) ? end : foundToken + m_str.size();
        return true;
    }

    void reset()
    {
    }

private:
    std::string m_str;
};

после того, как мы сможем создать

boost::tokenizer<FindStrTFunc> tok("some input...some other input");

и использовать, как обычный повышающий токенизатор

2
ответ дан Alek86 26 August 2018 в 14:47
поделиться
  • 1
    реализация не идеальна (может быть, ошибки), это всего лишь пример – Alek86 9 January 2012 в 02:23

, используя iter_split, вы можете использовать несколько символьных токенов. В приведенном ниже коде будет приведено следующее: бабуин дельфина mon-key

#include <iostream>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/iter_find.hpp>

    // code starts here
    std::string s = "dolphin--mon-key--baboon";
    std::list<std::string> stringList;
    boost::iter_split(stringList, s, boost::first_finder("--"));

    BOOST_FOREACH(std::string token, stringList)
    {    
        std::cout << token << '\n';  ;
    }
10
ответ дан AnthonyC 26 August 2018 в 14:47
поделиться
  • 1
    Это имеет недостаток в создании копии всей строки. Если строка, являющаяся токенизированной, является большой, это проблема. Этот токенизатор не делает этого. – The Science Boy 11 October 2012 в 22:09

Один из вариантов - попробовать boost :: regex. Не уверен в производительности по сравнению с обычным токенизатором.

std::string s = "dolphin--monkey--baboon";

boost::regex re("[a-z|A-Z]+|--");
boost::sregex_token_iterator iter(s.begin(), s.end() , re, 0);
boost::sregex_token_iterator end_iter;

while(iter != end_iter)
{
    std::cout << *iter << '\n';
    ++iter;
}
1
ответ дан Naveen 26 August 2018 в 14:47
поделиться
  • 1
    Это мило. Если он работает, он получает мой голос. :) – The Science Boy 11 October 2012 в 22:10
Другие вопросы по тегам:

Похожие вопросы: