1

stringコマンドのCMakeドキュメントには次のように書かれています:

REGEX MATCH は、正規表現と 1 回一致し、その一致を出力変数に格納します。

ただし、次のようにパターンを検索すると:

STRING(REGEX MATCH "#import <(.+)>" input_directive "${shader_code}")

「${shader_code}」は次のとおりです。

#import <../ColorCorrection.glsl>
#import <../YCbCrtoRGB.glsl>

uniform sampler2DRect srcFrame;
uniform vec2 sourceDimensions;

次のような結果が得られます。

#import <../ColorCorrection.glsl>
#import <../YCbCrtoRGB.glsl>

これはあってはならないことです。結果の最初の行だけを取得する必要があります。このパターンを数回検索し、まとめてグロム処理しているようです。

これは予想される動作ですか?それを回避する方法はありますか?基本的に、コードからのすべての #import ステートメントの最初のみが必要です。

4

1 に答える 1

1

はい、これは予期された動作です。CMake の正規表現解析は少しトリッキーな場合があり、ドキュメントには例がほとんどありません。

あなたの正規表現では、<(.+)>. これは<、 に続いて任意の文字を 1 回以上検索し、その後に を検索することを意味し>ます。問題は、文字列.*の最初の文字が消費され、その後のすべての文字が文字列>の最後まで消費されることです。>

希望の動作を得るには、以外の文字を指定する>とうまくいくと思います:

STRING(REGEX MATCH "#import <[^>]+>" input_directive "${shader_code}")
于 2013-11-08T19:39:13.933 に答える