Pregunta

Estoy tratando de encontrar una buena manera de obtener un escáner para usar un delimitador dado como token. Por ejemplo, me gustaría dividir un pedazo de texto en trozos de dígitos y no dígitos, por lo que idealmente solo establecería el delimitador \D Y establezca una bandera como UsedElimititerTokeken, pero después de mirar brevemente la API, no tengo nada. En este momento he tenido que recurrir a usar lookheads combinados/lookshinds para el delimitador, lo cual es algo doloroso:

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

Esto busca cualquier transición de un dígito a un no dígito o viceversa. ¿Hay una forma más sana de hacer esto?

¿Fue útil?

Solución

Editar: la pregunta editada es muy diferente, mi respuesta original no se aplica en absoluto. Para que conste, lo que estás haciendo es La forma ideal de resolver su problema, en mi opinión. Su delimitador es el límite de ancho cero entre un dígito y un no dígito, y no hay una forma más sucinta de expresar eso de lo que publicaste.

Edit2: (En respuesta a la pregunta que se hace en el comentario). Originalmente solicitó una alternativa a esta regex:

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

Eso es casi exactamente como \b, la construcción de la palabra-todo, funciona:

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

Es decir, una posición precedida por un carácter de palabra y no seguida por uno, o seguida de un carácter de palabra y no precedido por uno. La diferencia es que \b puede coincidir al principio y al final de la entrada. Obviamente no querías eso, así que agregué lookringounds para excluir esas condiciones:

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

Es una forma más concisa de hacer lo que hizo tu regex. Pero luego cambió el requisito para coincidir los límites de dígitos/no dígitos, y no hay taquigrafía para eso como \b Para límites de palabra/no palabras.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top