2017-03-15 4 views
1

特定のCプリプロセッサの定義に対して、#elseの大文字小文字が見つかりません。Cプリプロセッサディレクティブの#elseの場合の正規表現

例:

#if defined(my_define) 
    // multiple 
    // lines 
    // of 
    // code 
#else 
    // multiple 
    // lines 
    // of 
    // code 
#endif 

それとも

#if defined (my_define) 
    // same as above from here 

しかし、私は#elseなしの場合と一致する必要はありません:

#if defined(my_define) 
    // multiple 
    // lines 
    // of 
    // code 
#endif 

私は、ネストされた#if秒間気にしません、上記のケースだけ。

私はディレクティブの間の行の任意の数を処理する方法がわからない

defined..?my_define.(\r\n|\r|\n)? 

で始まる試してみました。

+1

(可能ですが)(https://regex101.com/r/01lRfw/1)、本当に醜いですね。 –

+0

ありがとうございます。私はそれを '#if defined ..?my_define \ b(?:(?!end?if)[* s \ S])* else(?:(?!#(?:) end)?if)[#s endif}に定義名(および空白)を含めると完璧に動作します:-)解答を書くことは自由です。 – mh333

答えて

1

あなたはここで鍛え貪欲トークンソリューションを使用することがあります。

  • #if defined - literlaの文字列
  • ..? - いかなる:

    #if defined..?my_define\b(?:(?!#(?:end)?if)[\s\S])*#else(?:(?!#(?:end)?if)[\s\S])*#endif 
    

    regex demo

    詳細を参照してください。 lin以外の1文字または2文字電子ブレーク文字

  • my_define\b - 単語全体my_define
  • (?:(?!#(?:end)?if)[\s\S])* - 焼き貪欲#endifまたは#ifリテラル文字列
  • #elseの出発点ではない任意の文字に一致するトークン - リテラル文字列を
  • (?:(?!#(?:end)?if)[\s\S])*から
  • #endif同上 - リテラル文字列