スキャナーを使用して、「p.addPoint(x、y);」という形式の文字列からコード行を読み込もうとしています。
私が求めている正規表現の形式は次のとおりです。
*anything*.addPoint(*spaces or nothing*
また,*spaces or nothing*
私がこれまで試したことは機能していません:[[.]+\\.addPoint(&&[\\s]*[,[\\s]*]]
私が間違っていることについて何か考えはありますか?
スキャナーを使用して、「p.addPoint(x、y);」という形式の文字列からコード行を読み込もうとしています。
私が求めている正規表現の形式は次のとおりです。
*anything*.addPoint(*spaces or nothing*
また,*spaces or nothing*
私がこれまで試したことは機能していません:[[.]+\\.addPoint(&&[\\s]*[,[\\s]*]]
私が間違っていることについて何か考えはありますか?
これを Python でテストしましたが、正規表現は Java に転送できるはずです。
>>> regex = '(\w+\.addPoint\(\s*|\s*,\s*|\s*\)\s*)'
>>> re.split(regex, 'poly.addPoint(3, 7)')
['', 'poly.addPoint(', '3', ', ', '7', ')', '']
あなたの正規表現はひどく不正な形式のようです。そうでなかったとしても、文字列の先頭にあるワイルドカード文字の無限の繰り返しに.
一致すると、実際には関連性がない/望ましくない大量のテキスト一致が発生する可能性があります。
編集:元の仕様を誤解しています。現在の正規表現は正しいはずです。
別の方法:
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);
}
}