2008-08-29 16 views
8

最近X/MotifからQtに移行したC++コードベースを扱っています。私はブール(Xから)のすべての出現をboolに置き換えるPerlスクリプトを書こうとしています。スクリプトは単純な置き換えを行うだけです。ブールをブールと置き換える正規表現

s/\bBoolean\b/bool/g 

いくつかの条件があります。

1)コードにCORBAがあり、\ bがではないを変更する必要があるCORBA :: Booleanと一致します。
2)それは、文字列(すなわち "ブール" として発見された場合は一致していません)

更新:#1については

を、私は#2の後読み

s/(?<!:)\bBoolean\b/bool/g; 

を使用私は先読みを使った。

s/(?<!:)\bBoolean\b(?!")/bool/g</pre> 

これは私の状況ではおそらく有効ですが、次の改善点はどうですか?

3)文字列の途中で一致しないでください(ありがとうnohat)。
4)コメント内のifと一致しない。 (//または/ ** /)

+0

サイドノート:http://stackoverflow.com/questions/72312/how-should-i-capitalize-perl#72757 – szabgab

答えて

0

条件1試して修正するには:

s/[^:]\bBoolean\b(?!")/bool/g 

を[^:]は、 ":" 以外の任意の文字に一致するように言います。

1
s/[^:]\bBoolean\b[^"]/bool/g 

編集:ラット、再び殴られました。 +1、私を打つための良い先生。

3

S/[^:] \ bBoolean \ bの/ブール/ gの

ブールは、行の先頭^ [becuaseことである。これは、文字列と一致していません( "?!): ]は "一致しない文字と一致する:"。

2

ブールが文字列の最後の部分ではなく、その最後の部分である場合にのみ一致します。あなたが文字列にいないことを確認したい場合は、マッチする文字の前に偶数の引用符をマッチさせる必要があります(複数行の文字列がないと仮定して)エスケープされた埋め込み引用符はありません)。

0

3)文字列の中央にある場合は一致しません(ありがとうございません)。

「。*ブール*」をチェックするためにreg exを書くことができます。しかし、文字列の中に引用符( "")を付けるとどうなりますか?パターンを除外(\ ")しないようにもっと多くの作業があります。

4)コメントには一致しないでください。 (//または/ * * /)

「//」は、除外する正規表現を//持つことができます。*しかし、最初に正規表現を置いて//コメント((。*)(//.*))の行全体を比較し、次に$ 1(最初に一致するパターン)で置換を適用することができます。

/* * /の場合、これは複数行のパターンであるため、より複雑です。 1つのアプローチは、まず複数行のコメントにマッチするようにコード全体を実行し、一致しない部分のみを取り出します。...(。*)(/*.**/)(。*)。しかし、実際の正規表現は、あなたが複数行のコメントのうちの1つではなく複数のコメントを持つほど複雑になります。

ここで/ *または*/insideブロックを使用するとどうなりますか? (私はあなたがなぜそれを持っているのかは知らないが、マーフィーの法律はあなたがそれを持つことができると言っている)。明らかにいくつかの方法がありますが、私の考えは、正規表現がどれほど悪く見えるかを強調することです。

私の提案は、C++のための字句ツールを使用し、ブールトークンをブールに置き換えることです。あなたの考え?

0

完全なCパーサーをperlに書くのを避けるために、バランスを取ろうとしています。変更の必要性に応じて、私は非常に限定的なもののようにする傾向があります。そして、/ Boolean /と一致するものは、人間の意思決定のために例外ファイルに書き込まれます。そうすることで、C中文字列、複数行コメント、条件付きコンパイル済みテキストなどを解析しようとしているわけではありません。

0
  1. ...
  2. ...
  3. は、文字列の途中であれば(nohatおかげで)一致していません。
  4. コメントの場合は一致しません。 (//または/ ** /)

いいえシンプル正規表現で行うことができます。そのためには、実際にを毎時の文字を左から右に見て、それ以外のものからの文字列からのコメントを区別するために少なくともどんな種類なのかを判断する必要があります。 "その他のもの"の部分に変更したいものが含まれているかどうかを確認する必要があります。

正確な C++のコメントと文字列の構文規則はわかりませんので、以下は不正確で完全にundebuggedになりますが、複雑なことがわかりますに対して。

my $line_comment  = qr! (?> // .* \n?) !x; 
my $multiline_comment = qr! (?> /\* [^*]* (?: \* (?: [^/*] [^*]*)?)*)* \*/) !x; 
my $string   = qr! (?> " [^"\\]* (?: \\ . [^"\\]*)* ") !x; 
my $boolean_type  = qr! (?<!:) \b Boolean \b !x; 

$code =~ s{ \G (
     $line_comment 
    | $multiline_comment 
    | $string 
    | ($boolean_type) 
    | . 
) }{ 
    defined $2 ? 'bool' : $1 
}gex; 

これをすべての複雑さで説明してもらえませんか、私には1日かかります。ここで何が起こっているのかを正確に理解したい場合は、Jeff   FriedlのMastering Regular Expressionsを購入して読んでください。

0

「文字列の途中で 『ブール』」の部分が少しそうに聞こえるそれのいずれかの発生が

m/"[^"]*Boolean[^"]*"/ 

のようなものを持つコードでそして、そこ場合があれば、私が最初にチェックしたいです何もない、あるいは少数ですが、その場合は無視してください。

1
#define Boolean bool 

プリプロセッサーがこれを処理します。ブール値が表示されるたびに、手動で修正することも、正規表現が間違っていないことを期待することもできます。あなたが使用するマクロの数に応じて、cppの中からダンプすることができます。

関連する問題