0

次のような入力が与えられた場合、変数が定数であることを確認する正規表現を記述する必要があります。

const size N = 1;
const size MAX = 1;
int const stant = 1147;
int x = 4;

これが私が作成した私の表現です:

const\s.*(\]|\s|\*)VARIABLETOCHECK(\(|\[|=|\s|;)

式の説明:

  • \s- "const" の後のスペース。
  • .*- 任意のシンボルの任意の数。
  • (\]|\s|\*)- 変数の前に置くべき記号。
  • VARIABLETOCHECKチェックしたい変数名を設定する場所です。
  • (\(|\[|=|\s|;)- 変数の後に続く記号

問題:

問題は、単語の後にスペースしかない場合const、表現が機能しないことです。

また、各変数 ( NMAXstant) は個別に一致する必要があります。

const\s.*(\]|\s|\*)N(\(|\[|=|\s|;)

これにより、文字列のみが選択されます。const size N = 1;

4

5 に答える 5

1

正規表現を使用:

\bconst\b\s*(?:.*\b)?(VARIABLETOCHECK\b[^=]*?)\s*\=\s*(.*?)\s*[,;]

ここでテストコードを参照してください。「const」構文を検証すると、変数名とその値が返されます。

于 2012-06-28T12:34:28.130 に答える
1

私があなたの質問を正しく理解していれば、あなたの目的は、エントリが定数であることを確認することです。

入力:テキスト行

期待される出力:定数の場合は True、そうでない場合は False


正規表現:

このために、次の正規表現をお勧めします。

^.*?const\s+(\w+\s+)?(\w)\s+=.*$

説明:

^行頭

.*?任意の文字が一致し、貪欲でない

constキーワード

\s+少なくとも 1 つの空白

(\w+\s+)?変数の名前ではないオプションの単語。

(\w)変数名である単語。

\s+オプションの空白

=リテラル値に等しい

.*任意の文字

$行の終わり

また、正規表現の 2 番目のグループは、定義済みの名前のリストで検証する場合に備えて、変数名を取得します。


上記の正規表現の結果:

const size N = 1;==>

const size MAX = 1;==>

int const stant = 1147; ==>

int x = 4; ==>

オプションで、マッチャーで 2 番目のグループを取得することで、変数名を取得できます。

私は VARIABLETOCHECK をハードコードしません。ほとんどの場合、ハードコードするのは悪い習慣です。

于 2012-06-28T13:19:40.723 に答える
0

私は道を間違っていた。

解決策は次のとおりです。 1. Doxygen をダウンロードします。 2. xml 形式の生成レポートを作成します。 3. xml からグローバル変数を取得します。

皆さん、ありがとうございました!

于 2012-06-28T17:52:34.147 に答える
0

これは非常に厄介で、言語のいくつかのテスト ケースでしか機能しません。C# と同じ方法で解析する正規表現を作成するのは非常に困難です。しかし、あなたが持っているもので働きましょう。

「変数の前に置くべきシンボル」と書いていますが、「変数の前に置くことができるシンボル」という意味ですよね?*したがって、これらの文字が発生する場合と発生しない場合があると言うには、後で必要です。

const\s.*(\]|\s|\*)*VARIABLETOCHECK(\(|\[|=|\s|;)

さて、.*変数の前に、実際には任意の文字列を意味します。おそらく除外する必要が;あり=、少なくとも、使用して

const\s[^;=]*(\]|\s|\*)*VARIABLETOCHECK(\(|\[|=|\s|;)
于 2012-06-28T12:35:53.217 に答える