0

スキャナーを使用して、「p.addPoint(x、y);」という形式の文字列からコード行を読み込もうとしています。

私が求めている正規表現の形式は次のとおりです。

*anything*.addPoint(*spaces or nothing*また,*spaces or nothing*

私がこれまで試したことは機能していません:[[.]+\\.addPoint(&&[\\s]*[,[\\s]*]]

私が間違っていることについて何か考えはありますか?

4

2 に答える 2

2

これを Python でテストしましたが、正規表現は Java に転送できるはずです。

>>> regex = '(\w+\.addPoint\(\s*|\s*,\s*|\s*\)\s*)'
>>> re.split(regex, 'poly.addPoint(3, 7)')
['', 'poly.addPoint(', '3', ', ', '7', ')', '']

あなたの正規表現はひどく不正な形式のようです。そうでなかったとしても、文字列の先頭にあるワイルドカード文字の無限の繰り返しに.一致すると、実際には関連性がない/望ましくない大量のテキスト一致が発生する可能性があります。

編集:元の仕様を誤解しています。現在の正規表現は正しいはずです。

于 2012-06-04T00:23:15.130 に答える
0

別の方法:

public class MyPattern {

    private static final Pattern ADD_POINT;
    static {
        String varName = "[\\p{Alnum}_]++";
        String argVal = "([\\p{Alnum}_\\p{Space}]++)";
        String regex = "(" + varName + ")\\.addPoint\\(" + 
                argVal + "," + 
                argVal + "\\);";
        ADD_POINT = Pattern.compile(regex);
        System.out.println("The Pattern is: " + ADD_POINT.pattern());
    }

    public void findIt(String filename) throws FileNotFoundException {
        Scanner s = new Scanner(new FileReader(filename));

        while (s.findWithinHorizon(ADD_POINT, 0) != null) {
            final MatchResult m = s.match();
            System.out.println(m.group(0));
            System.out.println("   arg1=" + m.group(2).trim());
            System.out.println("   arg2=" + m.group(3).trim());
        }
    }

    public static void main(String[] args) throws FileNotFoundException {
        MyPattern p = new MyPattern();
        final String fname = "addPoint.txt";
        p.findIt(fname);
    }

}
于 2012-06-04T02:04:34.720 に答える