0

のような変数名が与えられた場合、myvariableそれへの参照を別の変数名に置き換える (リファクタリングする) ために使用できる正規表現は何ですか?myreplacementvariable

例えば

addr = &myvariable;

に変わるはずです

addr = &myreplacementvariable;

しかし

int myvariable2 = 0;

そのままにしておく必要があります(たまたま の名前が含まれているのは別の変数名であるためmyvariable

おそらく正規表現を使用して、1行または2行のPythonを探しています。

注: C の解析が非常に難しいことは承知しており、スコープについて考えているものを探しているわけではありません。char *mystr = "myvariable";また、問題が発生することも予測していますが、それを回避することはできます。

前もって感謝します

4

3 に答える 3

0

次の正規表現を使用します。

\bvarname\b

varname任意の有効な変数名にすることができます (この正規表現で記述されています[A-Za-z_][A-Za-z0-9_]*)。

C の変数はa-z、 、A-Z0-9および_で構成されます。これは、単語 character として定義されたものとまったく同じ\wであり、単語境界\bの定義が基づいています。変数名が他の変数名の一部ではなく、リテラル番号の接尾辞でもないようにする必要があります (例: 3.0f, 0x87654321UL)。そのため\b、変数名の両端で を使用します。

于 2013-02-11T15:05:16.550 に答える
0

たぶんこれが役立ちます:

value = "addr = &myvariable;"
findVar = "myvariable"
m = re.findall("[&]{0};".format(findVar), value)
print m
# prints: ['&myvariable;']

[] 内にアンパサンドを入れてエスケープしたことに注意してください。2 つのバックスラッシュでエスケープすることもできます。

m = re.findall("\\&{0};".format(findVar), value)

編集:

コメントでの議論に基づく re.sub バージョンは次のとおりです。

value = "addr = &myvariable;\naddr = &myvariable;\nfuncCall( &myvariable )"
oldVarName = "myvariable"
newVarName = "mynewvariable"
m = re.sub("(\\&){0}(;?)".format(oldVarName), r"\1"+newVarName+r"\2", value)
print m
# this will print:
# addr = &mynewvariable;
# addr = &mynewvariable;
# funcCall( &mynewvariable )

このパターンは、次と同じ結果になります。

value.replace("&"+oldVarName,"&"+newVarName)

最初のアンパサンドと最後のセミコロンを一致させるために括弧を使用しています。次に、\1 と \2 を使用して、これらの一致を置換文字列内に戻します。この結果は、value.replace("&"+oldVarName, "&"+newVarName) を使用した場合と同様になることに注意してください。

編集: これはおそらく必要なものに近いです。

アンパサンドで始まるすべてのインスタンスを置き換え、AND には古い変数名全体が含まれ、[A-Za-z0-9_] 内にあるその後の文字は含まれません。

value = "addr = &myvariable;\naddr = &myvariable;\nfuncCall( &myvariable )\nfuncCall2( &myvariable, &myvariablelongername )"
oldVarName = "myvariable"
newVarName = "mynewvariable"
m = re.sub("(\\&){0}(?![A-Za-z0-9_])".format(oldVarName), r"\1"+newVarName, value)
print m
# prints:
# addr = &mynewvariable;
# addr = &mynewvariable;
# funcCall( &mynewvariable )
# funcCall2( &mynewvariable, &myvariablelongername )

(その最後の部分は、C の変数名で、開始する必要がある最初の文字 [A-Za-z_] の後の任意の有効な文字です。これは、「nhahtdh」による回答にも記載されています)

nhahtdh が例として提供したものを使用すると、これは最後の例の短いバージョンになります。

re.sub("(\\&){0}(?!\b)".format(oldVarName), r"\1"+newVarName, value)

この回答を書いたときは初めてで、この回答のコメントで自分で混同したので、これを情報として追加します。r"\1" のような文字列の前のrは、文字列を raw に変換しますストリング。

r '\ が保持される (リテラル化された) 生の文字列: 正規表現と Windows パスに便利!' ソース: http://rgruet.free.fr/PQR26/PQR2.6.html#Strings

于 2013-02-11T14:53:36.463 に答える
0

この正規表現を使用してください: (\W)myvariable(\W) と置き換えます\1myreplacementvariable\2

于 2013-02-11T14:42:17.067 に答える