Java: Use delimitador de scanner como token
-
24-09-2019 - |
Pergunta
Estou tentando encontrar uma boa maneira de fazer com que um scanner use um determinado delimitador como um token. Por exemplo, eu gostaria de dividir um texto em dígitos e pedaços não dígitos, então idealmente eu apenas definiria o delimitador para \D
E defina alguma bandeira como o UsadoLimiterasToken, mas depois de olhar brevemente através da API, não estou inventando nada. No momento, tive que recorrer ao uso de lookaheads/lookbehinds combinados para o delimitador, o que é um tanto doloroso:
scanner.useDelimiter("((?<=\\d)(?=\\D)|(?<=\\D)(?=\\d))");
Isso procura qualquer transição de um dígito para um não-dígito ou vice-versa. Existe uma maneira mais sã de fazer isso?
Solução
EDIT: A pergunta editada é tão diferente que minha resposta original não se aplica. Para o registro, o que você está fazendo é A maneira ideal de resolver seu problema, na minha opinião. Seu delimitador é o limite de largura zero entre um dígito e um não dígito, e não há uma maneira mais sucinta de expressar isso do que você postou.
Edit2: (em resposta à pergunta feita no comentário.) Você pediu originalmente uma alternativa a este regex:
"((?<=\\w)(?=[^\\w])|(?<=[^\\w])(?=\\w))"
É quase exatamente como \b
, a construção de palavras, obras:
"(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)"
Isto é, uma posição que é precedida por um personagem de palavra e não seguida por um, ou seguida por um personagem de palavra e não precedida por um. A diferença é que \b
pode corresponder no início e no final da entrada. Você obviamente não queria isso, então eu adicionei lookounds para excluir essas condições:
"(?!^)\\b(?!$)"
É apenas uma maneira mais concisa de fazer o que seu Regex fez. Mas então você mudou o requisito para combinar limites de dígitos/não dígitos, e não há abreviação para isso \b
para limites de palavras/não palavras.