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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top