0

次のようなメソッド定義を比較したい:

1. static void main(String[] args){

2. static void main(String[] args)
{
3. int sum()
4. int abc(int a,int b){

私はメソッドの名前を持っているだけで、一度に1行ずつファイルを読んでいます。

正規表現は、次のようなメソッド呼び出しを比較すべきではありません:

sum();
OBJ.abc(1,2);

私は動作していない正規表現を書きました:

$srcLine =~ m/$methodName[\([A-Z]*[a-z]*[0-9]*\s*[,]*\(*\)*\)]*/)

この行でコンパイル エラーが発生します。

編集

$srcLine =~ m/$methodName\((?!~)+\)/

これは、「methodName('~'以外の何か)」と比較している別の正規表現です。

4

1 に答える 1

2

パターンがどの程度制限されるべきかはわかりませんが、正規表現の問題については説明できます。

  1. $srcLine =~ m/$methodName[\([A-Z]*[a-z]*[0-9]*\s*[,]*\(*\)*\)]*/)

    角かっこを使用して文字クラスを作成しているため、それらを混在させることはできません。それで、あなたはそこにグループが欲しかったと思います。

    $srcLine =~ m/$methodName(?:\([A-Z]*[a-z]*[0-9]*\s*[,]*\(*\)*\))*/)
    

    あなたの要件に少し近づくでしょう。その部分についてはわかりません[,]*。つまり、リテラル「、」に0回以上一致することを意味します。これはおそらくあなたが望むものではありません。

  2. $srcLine =~ m/$methodName\((?!~)+\)/

    (?!~)+ゼロ幅アサーション (パーツ)を繰り返すことはできません。特定の文字以外に一致すると言いたい場合は、否定文字クラスを使用します。

    $srcLine =~ m/$methodName\([^~]+\)/
    

    これは、最後に見つかった閉じ括弧まで一致することに注意してください。

于 2012-09-26T07:46:02.027 に答える