0

コードを分析し、シェーダーごとに処理する必要がある入力と出力を動的に決定できるようにする GLSL シェーダー コード用のプロセッサを作成しようとしています。

これを実現するために、正規表現を使用してシェーダー コードを解析してから、OpenGL 経由でコンパイルすることにしました。

正規表現が期待どおりに機能していることを確認するために、いくつかのテスト コードを作成しました。

コード:

#include <iostream>
#include <string>
#include <regex>

using namespace std;

int main()
{

string strInput = "      in   vec3   i_vPosition;    ";
smatch match;
// Will appear in regex as:
//   \bin\s+[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*(\[[0-9]+\])?\s*;
regex rgx("\\bin\\s+[a-zA-Z0-9]+\\s+[a-zA-Z0-9_]+\\s*(\\[[0-9]+\\])?\\s*;");

bool bMatchFound = regex_search(strInput, match, rgx);

cout << "Match found: " << bMatchFound << endl;

for (int i = 0; i < match.size(); ++i)
{
    cout << "match " << i << " (" << match[i] << ") ";
    cout << "at position " << match.position(i) << std::endl;
}

}

唯一の問題は、上記のコードが 1 つではなく 2 つの結果を生成することです。結果の1つは空ですが。

出力:

Match found: 1
match 0 (in   vec3   i_vPosition;) at position 6
match 1 () at position 34

最終的には、ファイル全体を入力として提供するときに複数の結果を生成したいのですが、一貫した方法で結果を処理できるように、ある程度の一貫性を確保したいと考えています。

1つしか期待していないのに、なぜ複数の結果が得られるのかについてのアイデアはありますか?

4

2 に答える 2

2

正規表現に後方参照が含まれているようです

(\[[0-9]+\])?

1 つ以上の数字を囲む角括弧が含まれますが、? オプションにします。正規表現を適用すると、先頭と末尾のスペースは

\s+ ... \s*

文字列の残りは、

[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*

また、後方参照ビットは空の文字列と一致します。

オプションでそのビットを含む文字列に一致させたいが、後方参照として返さない場合は、?: のようにパッシブにします。

\bin\s+[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*(?:\[[0-9]+\])?\s*
于 2013-06-15T03:43:13.280 に答える
0

最終的に複数の結果を生成したい

regex_search は、完全な正規表現の最初の一致のみを検索します。完全な正規表現が一致するソース テキスト内の他の場所を見つけたい場合は、regex_search を繰り返し実行する必要があります。検索を繰り返し実行する例については、「句読点のない単語に一致する C++ 正規表現」を参照してください。

上記のコードは、1 つではなく 2 つの結果を生成します。

紛らわしいですね。

正規表現

\bin\s+[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*(\[[0-9]+\])?\s*;

丸括弧 () を含みます。丸括弧は、「グループ」別名「部分式」を作成します。部分式はオプションの "(....)?" であるため、部分式が実際には何にも一致しなくても、式全体が一致することが許可されます。サブ式が何にも一致しない場合、そのサブ式の値は空の文字列です。「キャプチャー括弧」と「非キャプチャー括弧」の詳細については、 「正規表現: グループ化に丸括弧を使用する」を参照してください。

regex_searchのドキュメントによると、

  • match.size()部分式の数に 1 を加えたものです。
  • match[0]完全な正規表現に一致するソース文字列の一部です。
  • match[1]正規表現内の最初のサブ式に一致するソース文字列の一部です。
  • match[n]正規表現内の n 番目の部分式に一致するソース文字列の一部です。

上記の例のように、部分式が 1 つしかない正規表現は、常に 2 の match.size() を返します -- 完全な正規表現に対して 1 つの一致、部分式に対して 1 つの一致 -- その場合でもsub-expression は実際には何にも一致しないため、空の文字列です。

于 2013-06-15T11:45:23.553 に答える