2016-04-25 3 views
1

従来の方法で文字列をトークン化する方法を説明しましたが、このトークンをトークンで分割するにはどうすればよいでしょうか?トークンで区切られたトークンのトークン化

例えばYYYYなどの日付/時刻画像所与例えば\ MMM \はHH DD:MM:SSは、私は以下でアレイに分割したい:

"yyyy", "\", "MMM", "\", "dd", " " , "HH", ":", "mm", ":", "ss" 

"トークン" YYYYであります、MMM、dd、HH、mm、ssである。私は区切り記号が何であるか分からず、トークンだけが分かります。しかし、セパレータは最終的な結果に現れる必要があります。トークンの完全なリストは、次のとおりです。

 "yyyy" // – four-digit year, e.g. 1996 
     "yy" // – two-digit year, e.g. 96 
     "MMMM" // – month spelled out in full, e.g. April 
     "MMM" // – three-letter abbreviation for month, e.g. Apr 
     "MM" // – two-digit month, e.g. 04 
     "M"  // – one-digit month for months below 10, e.g. 4 
     "dd" // – two-digit day, e.g. 02 
     "d"  // – one-digit day for days below 10, e.g. 2 
     "ss" // - two digit second 
     "s"  // - one-digit second for seconds below 10 
     "mm" // - two digit minute 
     "m"  // - one-digit minute for minutes below 10 
     "tt" // - AM/PM designator 
     "t"  // - first character of AM/PM designator 
     "hh" // - 12 hour two-digit for hours below 10 
     "h"  // - 12 hour one-digit for hours below 10 
     "HH" // - 24 hour two-digit for hours below 10 
     "H"  // - 24 hour one-digit for hours below 10 

は、私は標準ライブラリのstd ::文字列が解析とtokenisingに非常に強力ではありません気づいたと私はブーストを使用することはできません。タイトな、慣用的な解決策はありますか?私はこれを行うためのCスタイルのアルゴリズムを打ち明けるのは嫌です。パフォーマンスは考慮されません。

+0

あなたのトークンは、常に特殊文字しようとしている、または彼らはあまりにも手紙だろうか? – WearyWanderer

+0

トークンは上記のトークンだけです。トークン間の文字は、日本語の文字(私はWindows上でwchar_tを使用する必要がありますので、それも潜在的な問題です)かもしれません。基本的には、任意のロケールで日付/時刻のピクチャ文字列がどのように見えるかは問わない。私が確かに知っているのは、それらのコンポーネントが上記のトークンを使って画像に定義されていることだけです。 – Robinson

+1

正規表現はC++ 11の一部です:http://www.cplusplus.com/reference/regex/パフォーマンスが絶対的な要件でない限り、正規表現を使用してください。 – Dummy00001

答えて

1

おそらくhttp://www.cplusplus.com/reference/cstring/strtok/が役に立ちます。有用な例があります。

ただし、区切り記号を使用します。この問題を解決するには、ベースポインタと結果の文字列を比較し、文字列の長さだけ前進させます。

#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <vector> 
#include <sstream> 

int main() 
{ 
    char data[] = "yyyy\\MMM\\dd HH:mm:ss"; 
    std::vector<std::string> tokens; 

    char* pch = strtok (data,"\\:");          // pch holds 'yyyy' 
    while (pch != NULL) 
    { 
     tokens.push_back(pch); 

     int delimeterIndex = static_cast<int>(pch - data + strlen(pch)); // delimeter index: 4, 8, ... 
     std::stringstream ss; 
     ss << delimeterIndex; 
     tokens.push_back(ss.str()); 

     pch = strtok (NULL,"\\:");           // pch holds 'MMM', 'dd', ... 
    } 

    for (const auto& token : tokens) 
    { 
     std::cout << token << ", "; 
    } 
} 

これは出力が得られます。

yyyy, 4, MMM, 8, dd HH, 14, mm, 17, ss, 20, 
+0

これは興味深いアプローチです。 – Robinson