2

C スタイルのプリプロセッサ用の単純なテキスト グラバーを作成しています。入力テキスト (サンプル):

#if 1 > 0
blah
#if defined MACRO1
blah blah blah
#if !defined MACRO2
blaaaah
#if      !   defined MACRO3
blah?

#if [!] definedすべてのステートメントの後に続くテキストをキャプチャしたい。上記のテキストから必要な出力は次のとおりです。

MACRO1
MACRO2
MACRO3

ここでキャプチャする必要がある行番号は、3、5、および 7 です。7 行目には、スペースとタブが混在していることに注意してください。

この結果が得られる表現を作成しようとしましたが、それほど素晴らしいものはありませんでした。望ましい結果をもたらす私の式は-

(?<=(?<=(?<=(?<=(?<=(?<=#if)[\s\t]+)!?)[\s\t]*)defined)[\s\t]+).*

使用されるオプションは次のとおりです: Multiline + IgnoreCase

しかし、これはエレガントでも簡潔でもないと確信しています。より良い表現を提案できる人はいますか?

PS - Expressoを使用して式をテストしています。

4

4 に答える 4

1

この正規表現はどうですか?

#if[\s\t]+[!]?[\s\t]*defined[\s\t]*(.*)

後方参照では、MACRO1/MACRO2/MACRO3 を取得します。

于 2011-04-07T18:36:32.310 に答える
1

s に改行などを含む質問の入力が含まれている場合、これは機能するはずです

foreach(var match in Regex.Matches(s, @"(?<=#if\s*!?\s*defined\s*)(?<macro_name>\w+)")) {
  Console.WriteLine(match);
}

MACRO01、MACRO02、MACRO03 が 3 つのキャプチャとして検出されます

于 2011-04-07T19:35:05.517 に答える
0

これは機能しますか、

^#if(?:[ \t]*!)?[ \t]*defined[ \t]*(.*?)$

複数行オプションなし?

于 2011-04-07T19:10:56.863 に答える
0

アイ・ナヤン

一般的な C ソース コード テキスト ストリーム内にあるすべての「#if defined」および「#if !defined」プリプロセッサ ディレクティブのマクロ参照名を取得する必要があることを理解しました...

その単純な正規表現をお勧めします

^#if\s*!?\s*defined\s*(\w*).*$

前の正規表現には、マクロ名だけを取得するために定義されたキャプチャ グループ (\w*) が 1 つだけあります。

キャプチャ グループには、出現するすべてのマクロ名が入力されます。

*PS: 正規表現は、複数行 + 大文字と小文字を区別しないオプションを使用して実行する必要があります。私は RegExr ツールhttp://gskinner.com/blog/archives/2008/03/regexr_free_onl.htmlでそれをテストしました*

于 2011-04-07T18:49:50.030 に答える