ファイルストリームからの入力を解析しようとしており、複数の単語の可能性を扱っているため、汎用サポートと完全にカスタマイズ可能なサポートを使用して処理したい場合、つまり、任意のタイプの入力を解析したい場合は、次に、正規表現が必要になります。
C++11 の正規表現を使用できますが、現時点では gcc でサポートされていません。
したがって、1 つの解決策は、標準の c++98、c++03、および c++0x で動作するはずの boost C++ ライブラリを使用することです。
#include <string>
#include <iostream>
#include <cstdlib>
#include <boost/regex.hpp>
using namespace std;
int main() {
string text = "hss cscf \"serving\" 32.5 ims 112.134";
boost::regex e("(\\w+)\\s(\\w+)\\s\"(\\w+\\s?)+\"\\s([0-9]+(\\.[0-9][0-9]?)?)\\s(\\w+)\\s([0-9]+(\\.[0-9][0-9]?)?)");
boost::sregex_token_iterator iter(text.begin(), text.end(), e, 0);
boost::sregex_token_iterator end;
for(; iter != end; ++iter) {
std::cout << *iter << std::endl;
}
return 0;
}
次の方法で、gcc (私は gcc-4.7.2 を使用) を使用してコンパイルできます。
g++ {filename} -std={language version} -I{your boost install location} -L{your boost library location} -o {output filename} {your boost library location}/libboost_regex.a
正規表現が恐ろしく長い理由については、regex を使用して完全な 10 進数の解析をサポートしたい場合、上記は次の文字列に対して正しく機能します。
"hss cscf \"serving\" 32.5 ims 112.134"
"hss cscf \"serving more than one\" 32.5 ims 112.134"
"hss cscf \"serving\" 32 ims 112"
参考文献:
ブースト正規表現: http://www.solarix.ru/for_developers/api/regex-en.html