どのようにC言語で文字列を解析++
-
05-09-2019 - |
質問
私は、彼らが構文を指定したか否かをチェックするように、文字列を解析します。
例:
Str = Z344-R565l t
ここに私の要件があり数であるべきでZ
後であることを後-
とそのR
がそこにスペースが続くl
続い数、続くとされなければならないの後、最終的にt
ます。
この以外のところは、それは誤りである必要があります。
私はこのような構文の多くの異なる種類を解析する必要があります。必要な構文の種類ごとに関数を記述する場合、私は厄介だろう。私はYACCまたはLEXは、この問題を解決することができると聞いています。
いずれかが私の問題にいくつかの光を投げていただけますか?
解決
ブーストを使用してください::正規表現
#include <string>
#include <boost/regex.hpp>
bool isMatch(std::string input){
boost::regex r("Z[0-9]*-R[0-9]*l t");
return boost::regex_search(input, r);
}
あなたができる他の事は、ファイル内の正規表現式のリストを提供し、1行に1つの表現です。ファイル入力を使用してブースト::正規表現オブジェクトのベクトルを作成し、検証する必要がある各文字列のパターンのベクトルを反復。それは非常に効率的ではないのですが、それは動作します。
他のヒント
あなたは正規表現でこれを行うます。
Z344-R565lトン
あなたの正規表現は、次のようになります。 C ++のために使用しますが、これはあなたの文字列が一致していることを確認するために、一般的な正規表現であることがどのような正規表現ライブラリわからない。
Z[0-9]+-R[0-9]+l t
ブースト::あなただけの構文をチェックしたい場合は正規表現で結構です。あなたは、このような表現を読んだときに、実際に何かをしたい場合は、私はあなたのようなものでブースト::スピリットを使用することをお勧めます:
rule<> testFormula =
(ch_p('Z') >> int_p)
>> (ch_p('-')>>ch_p('R')>>int_p>>ch_p('l'))
>> space_p >> ch_p('t');
私は([]演算子を使用して)あなたには、いくつかのアクションに接続したい場合があります式の部分を単離した。
マニュアルを参照してくださいする詳細については、
あなたは "runtime parser generation
" または類似した何かをgoogleのかもしれません...
lex
とyacc
(またはそのGNU equivaents flex
とbison
)コンパイル時に自分の仕事をし、あなたのニーズに十分に柔軟ではないかもしれません。 (または彼らは、あなたは非常に具体的じゃない場合があります)。
は、ブーストを使用する必要、正規表現は、TR1の一部がされていない、あなたは、このヘッダーでそれらを使用することができます。#include <regex>
例(あなたはエスケープ文字の二重\
を使用する必要があります):
string dateorder = "12/07/2009";
tr1::regex expr("^([1-2][0-9]|0?[1-9]|30|31)/([1-9]|10|11|12)/(2\\\d{3})$");
if (!regex_match(dateorder.begin(),dateorder.end(),expr))
{
...
break;
}