2

文字列を解析して、構文が指定されているかどうかを確認したい。

例:

Str = Z344-R565l t

ここで私の要件は、その後Zに数字があり、その後に-aRがあり、その後に数字が続きl、その後に 、スペースが続き、最後にt.

これ以外の場合は、エラーになるはずです。

このようなさまざまな種類の構文を解析する必要があります。必要な構文の種類ごとに関数を作成すると、気まずくなります。この問題は yacc や lex で解決できると聞きました。

誰でも私の問題に光を当てることができますか?

4

5 に答える 5

6

これは正規表現で行います。

Z344-R565lt

正規表現は次のようになります。C ++に使用する正規表現ライブラリはわかりませんが、これは文字列が一致することを確認するための一般的な正規表現です.

Z[0-9]+-R[0-9]+l t
于 2009-02-18T04:02:52.467 に答える
4

boost::regexを使用する

#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行に1つずつ指定することです。ファイル入力を使用してboost::regexオブジェクトのベクトルを作成し、検証する必要のある各文字列のパターンのベクトルを反復処理します。あまり効率的ではありませんが、機能します。

于 2009-02-18T05:08:08.207 に答える
1

「 」などをググるかもしれませんruntime parser generation...

lexおよびyacc(またはそれらの GNU に相当するflexおよびbison) はコンパイル時に作業を行うため、必要に応じて十分な柔軟性がない場合があります。(または、そうかもしれませんが、あまり具体的ではありません)。

于 2009-02-18T03:51:01.047 に答える