Мне нравится идея StringTokenizer, потому что это Enumerable.
Но он также устарел и заменяется на String.split, который возвращает скучную строку [] (и не включает разделители).
Таким образом, я реализовал StringTokenizerEx, который является Iterable, и который использует истинное регулярное выражение для разделения строки.
Истинное регулярное выражение означает, что это не «последовательность символов», повторяемая для формирования разделителя:
«o» будет соответствовать только «o» и разделит «ooo» на три разделителя с двумя пустыми строками внутри:
[o], '', [o], '', [o]
Но регулярное выражение o + вернет ожидаемый результат при разбиении "aooob"
[], 'a', [ooo], 'b', []
Чтобы использовать этот StringTokenizerEx:
final StringTokenizerEx aStringTokenizerEx = new StringTokenizerEx("boo:and:foo", "o+");
final String firstDelimiter = aStringTokenizerEx.getDelimiter();
for(String aString: aStringTokenizerEx )
{
// uses the split String detected and memorized in 'aString'
final nextDelimiter = aStringTokenizerEx.getDelimiter();
}
Код этого класса доступен на DZone Snippets .
Как обычно для ответа на вызов кода (один автономный класс с включенными тестовыми примерами), скопируйте и вставьте его (в каталог 'src / test') и запустите его . Его метод main () иллюстрирует различные способы использования.
Примечание: (конец 2009 года редактировать)
В статье Заключительные мысли: Java Puzzler: Расщепление Волоски делает хорошую работу explaning причудливое поведение String.split()
.
Джош Блох даже прокомментировал в ответ на эту статью:
Да, это боль. FWIW, это было сделано по очень веской причине: совместимость с Perl.
Парнем, который сделал это, является Майк «сумасшедший» Макклоски, который сейчас работает с нами в Google. Майк позаботился о том, чтобы регулярные выражения Java проходили практически все тесты регулярных выражений Perl 30K (и работали быстрее).
Общая библиотека Google Guava содержит также разделитель, который:
- проще в использовании
- поддерживается Google (а не вами)
Так что, возможно, стоит проверить. Из их исходной грубой документации (pdf) :
У JDK есть это:
String[] pieces = "foo.bar".split("\\.");
Хорошо использовать это, если вы хотите именно то, что он делает: - регулярное выражение - результат в виде массива - его способ обработки пустых частей
Мини-головоломка: ", a ,, b,". Split (",") возвращает ...
(a) "", "a", "", "b", ""
(b) null, "a", null, "b", null
(c) "a", null, "b"
(d) "a", "b"
(e) None of the above
Ответ: (д) Ничего из вышеперечисленного.
",a,,b,".split(",")
returns
"", "a", "", "b"
Пропускаются только конечные тары! (Кто знает обходной путь для предотвращения пропуска? Это забавно ...)
В любом случае наш Splitter просто более гибок: поведение по умолчанию упрощено:
Splitter.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
Если вы хотите дополнительные функции, попросите их!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
Порядок методов конфигурации не имеет значения - во время разделения, обрезка происходит перед проверкой на пустые.