2012-01-15

java.util.Scannerでコメント文をスキップさせたい

スクリプト言語のコメントをjava.util.Scannerに処理させたい。
commandA(myVar, 10)
; コメント
commandB(200)
区切りパターンにそれらしい正規表現を入れたら上手くいった。
scanner.useDelimiter("(\\s|;.*(\r|\n|\r\n))+");

java.util.Scannerでスクリプトの命令文を分割したい

スクリプトの命令文「command(myVar, 100)」を
"command" "(" "myVar" "," "100" ")"
の6つに分割したい。カッコもコンマもスクリプトの要素として意味があるので、分割結果として欲しい。が、java.util.Scannerをそのまま使うと
"command(myVar," "100)"
の2つに分割されてしまう。Scannerにテキストの区切りパターン(正規表現)を設定することは可能だが、カッコやカンマを区切りパターンに追加すると、今度は分割結果から無くなってしまう。
"command" "myVar" "100"
そんな場合は、Scanner#findInLine(Pattern pattern)で、さらに細かく分割すれば良いようだ。
Pattern pattern = Pattern.compile("[(),]|[a-zA-Z0-9]+");
Scanner scanner = new Scanner("command(myVar, 100)");
while (scanner.hasNext()) {
    for (;;) {
        String token = scanner.findInLine(pattern);
        if (token == null) {
            break;
        }
        System.out.println(token);
    }
}
以下の結果を得ることが出来た。
command
(
myVar
,
100
)