Мені подобається ідея StringTokenizer, оскільки вона безліч.
Але він також є застарілим і замінює String.split, який повертає нудний рядок [] (і не включає роздільники).
Тож я реалізував StringTokenizerEx, який є Ітерабельним, і який потребує справжнього регулярного вираження, щоб розділити рядок.
Справжнє регулярне вираження означає, що це не послідовність символів, повторювана для формування роздільника:
'o' буде відповідати лише 'o', а розділити 'ooo' на три роздільники, з двома порожніми рядками всередині:
[o], '', [o], '', [o]
Але regexp 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' та запустіть його . Основний () метод ілюструє різні звичаї.
Примітка: (кінець 2009 року редагувати)
Стаття Остаточні думки: Java Puzzler: Розщеплення волосся робить добру роботу, пояснюючи химерну поведінку в String.split().
Джош Блох навіть прокоментував у відповідь на цю статтю:
Так, це біль. FWIW, це було зроблено з дуже вагомої причини: сумісність з Perl.
Хлопець, який це зробив, - це Майк "божевільний" Макклоскі, який зараз працює з нами в Google. Майк переконався, що регулярні вирази Java пройшли практично кожен тест регулярних виразів 30K Perl (і бігали швидше).
Загальна бібліотека 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.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
Якщо ви хочете додаткові функції, попросіть їх!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
Порядок методів конфігурації не має значення - під час розщеплення відбувається обрізка, перш ніж перевірити порожнечі.