Java StreamTokenizer, кажется, слишком жадный в идентификации чисел. Это относительно легкий вариант конфигурации, и я не нашел способа заставить его делать то, что я хочу. Следующий тест проходит, IMO показывает ошибку в реализации; то, что я действительно хотел бы, чтобы второй токен был идентифицирован как слово "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, но это потребовало бы большого рефакторинга.