【问题标题】:Easiest way to tokenize/split a string using string delimiters?使用字符串分隔符标记/拆分字符串的最简单方法?
【发布时间】:2013-01-21 01:18:40
【问题描述】:

好的,我承认字符串操作在 C++ 方面从来都不是我的强项,虽然我在各种情况下仅通过使用 Boost 就取得了相当大的成功,但我仍然遇到了一些问题。

所以,这就是我需要的(示例很准确)...


输入是:

position fen <arg_a1> <arg_a2> ... <arg_aN> moves <arg_b1> <arg_b2> ... <arg_bN>

(好吧,对于熟悉该主题的人来说,这是UCI协议的命令)

我只想:

  • <arg_a1> <arg_a2> ... <arg_aN>(包括空格)合并为一个字符串(即positionmoves 之间的字符串
  • 还将<arg_b1> <arg_b2> ... <arg_bN> 放入另一个字符串(即从moves 到结尾的字符串)。

我用Boost::split 玩了很多,但显然这很像strtok(接受字符不是字符串 分隔符)。

我应该怎么做?解决这个特定问题的最简单方法是什么,而不需要我重新发明轮子(我倾向于这样做......经常......哈哈)?

提示:显然我可以做到。但我现在能想到的都是丑陋的。我正在寻找的是一种 C++ 友好的方式...

【问题讨论】:

  • 这看起来很简单。如果你知道positionmoves这两个词的确切位置,你会怎么做?现在,您将如何在输入字符串中找到这些单词的位置?我敢打赌,如果你把这两件事放在一起,一个可能的解决方案就会很清楚。
  • 你可能想看到这个答案——stackoverflow.com/a/236803/701092
  • Greg 的评论 +1。除此之外,您应该使用std::string 函数来执行此操作 - 将其与提升拆分、正则表达式等复杂化并没有什么好处。
  • @GregHewgill 好吧,我绝对不知道为什么我必须由其他人阅读它,但你猜怎么着:它是通过两个简单的::find::substr 语句解决的。出于某种奇怪的原因,它不再让我觉得丑了……哈哈。谢了哥们! ;-)
  • @Dr.Kameleon 下一步:在下面回答您自己的问题,然后接受您的正确答案。

标签: c++ parsing boost split token


【解决方案1】:

这是解决方案(带有一些数字技巧):

    // where are 'fen' and 'moves' within the initial string?
    int fenPos = input.find("fen");
    int movesPos = input.find("moves");

    // get the exact string but taking into account the position of our initial tokens
    // as well as their length (e.g. fenPos.length()+1 = 4, etc)
    string fen = input.substr(fenPos+4,movesPos-fenPos-5);
    string moves = input.substr(movesPos+6);

所以输入:

"position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 moves f2f3 e7e6 g2g4",这会返回:

fen   = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
moves = "f2f3 e7e6 g2g4"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 2011-09-11
    • 1970-01-01
    • 2015-12-28
    • 2011-12-26
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    相关资源
    最近更新 更多