Java の StreamTokenizer は、数値の識別に貪欲すぎるようです。構成オプションが比較的少なく、自分のやりたいことを実行する方法が見つかりません。次のテストに合格し、IMO は実装にバグを示しています。私が本当に望んでいるのは、2 番目のトークンが単語「20001_to_30000」として識別されることです。何か案は?
public void testBrokenTokenizer()
throws Exception
{
final String query = "foo_bah 20001_to_30000";
StreamTokenizer tok = new StreamTokenizer(new StringReader(query));
tok.wordChars('_', '_');
assertEquals(tok.nextToken(), StreamTokenizer.TT_WORD);
assertEquals(tok.sval, "foo_bah");
assertEquals(tok.nextToken(), StreamTokenizer.TT_NUMBER);
assertEquals(tok.nval, 20001.0);
assertEquals(tok.nextToken(), StreamTokenizer.TT_WORD);
assertEquals(tok.sval, "_to_30000");
}
FWIW 代わりに StringTokenizer を使用できますが、多くのリファクタリングが必要になります。