2010-03-03 3 views
0

Я пытаюсь найти хороший способ заставить сканер использовать данный разделитель как токен. Например, я хотел бы разделить кусочек текста на цифры и несимметричные фрагменты, поэтому в идеале я бы просто установил разделитель на \D и установил некоторый флаг как useDelimiterAsToken, но после краткого изучения API я не придумывая ничего. Сейчас я должен был прибегать к использованию комбинированного lookaheads/Утверждения назад для разделителей, что несколько болезненно:Java: использовать разделитель сканера как токен

scanner.useDelimiter("((?<=\\d)(?=\\D)|(?<=\\D)(?=\\d))"); 

Это выглядит для любого перехода от цифры к нецифре или наоборот. Есть ли более разумный способ сделать это?

+0

См. Http://stackoverflow.com/questions/2206378/how-to-split-a-string-but-also-keep-the-delimiters, возможно, это помогает. –

+0

проблема заключается в том, что если бы я сделал то же самое для '\ d' или' \ d + ', он будет совпадать со слишком большим количеством мест. – daltonb

ответ

1

EDIT: отредактированный вопрос настолько отличается, мой первоначальный ответ не применяется вообще. Для записи, что вы делаете , - идеальный способ решить вашу проблему, на мой взгляд. Ваш разделитель - это граница нулевой ширины между цифрой и не цифрой, и нет более сжатого способа выразить это, чем то, что вы разместили.

EDIT2: (В ответ на вопрос, заданный в комментариях.) Вы первоначально просили альтернативы этому регулярному выражению:

"((?<=\\w)(?=[^\\w])|(?<=[^\\w])(?=\\w))" 

Это почти как именно \b, слово-граница конструкт, работает:

"(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)" 

То есть позиция, которой предшествует символ слова, а за ней не следует, или за которым следует символ слова и не предшествует одному. Разница в том, что \b может совпадать в начале и конце ввода. Вы, очевидно, не хотел, так что я добавил lookarounds, чтобы исключить эти условия:

"(?!^)\\b(?!$)" 

Это просто более краткий способ сделать то, что ваше регулярное выражение сделал. Но тогда вы изменили требование на сопоставление границ цифр и не цифр, и для строк типа \b нет сокращений для границ слов/неслов.

+0

Они уже предотвращены в регулярном выражении, которое я использую. – daltonb

+0

Я знаю, я просто предлагал более короткое регулярное выражение для выполнения того же самого. Но вы изменили требования, так что теперь это не имеет значения. –

+0

Я все еще немного смущен относительно того, как ваше решение помогло бы в первом случае. Это та же проблема сейчас, за исключением цифр вместо слов .. Я просто не хотел, чтобы границы слов были вариантом, так как я на самом деле делаю что-то более сложное. – daltonb