Java: использовать разделитель сканера в качестве токена - PullRequest
0 голосов
/ 03 марта 2010

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

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

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

1 Ответ

1 голос
/ 03 марта 2010

РЕДАКТИРОВАТЬ: отредактированный вопрос настолько отличается, мой оригинальный ответ не применяется вообще. Для справки, на мой взгляд, то, что вы делаете , является идеальным способом решения вашей проблемы. Ваш разделитель - это граница нулевой ширины между цифрой и не цифрой, и нет более краткого способа выразить это, чем то, что вы опубликовали.

РЕДАКТИРОВАТЬ 2: (В ответ на вопрос, заданный в комментарии.) Вы первоначально попросили альтернативу этому регулярному выражению:

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

Почти точно так же работает \b, слово-граничная конструкция:

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

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

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

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

...