es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Separar el texto en formato de joroba de camello con grupos de números.

Tengo cadenas que contienen texto en notación camel case y números y me gustaría dividirlos.

Por ejemplo, la cadena “”abcDefGhi345J6″” debe dividirse en

[“abc”, “Def”, “Ghi”, “345”, “J”, “6”]

Mi mejor esfuerzo es

"abcDefGhi345J6".split("(?=\\p{Lu})|(?!\\p{Lu})(?=\\d+)")

lo cual me devuelve

[“abc”, “Def”, “Ghi”, “3”, “4”, “5”, “J”, “6”]

PD: Las respuestas repetidas no dan el resultado esperado ya que no son agnósticas de Unicode.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para dividir una cadena que contiene texto en camel case y números, podemos usar una expresión regular para identificar los lugares donde comienza una nueva palabra o número. Aquí está una explicación de la expresión regular utilizada en el ejemplo:

    • (?=\\p{Lu}) – Lookahead para una letra mayúscula Unicode.
    • | – Alternancia, que significa “o”.
    • (?!\\p{Lu})(?=\\d+) – Negative lookahead para una letra mayúscula Unicode, seguida de un lookahead para uno o más dígitos.

    Uniendo estas piezas, podemos dividir la cadena en cualquier punto donde ocurra una letra mayúscula o una secuencia de dígitos. Aquí está el código utilizado en el ejemplo:

    String string = "abcDefGhi345J6";
    String[] partes = string.split("(?<=\\p{Ll})(?=\\p{Lu})|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
    System.out.println(Arrays.toString(partes));
    

    Esto dará como resultado:

    [abc, Def, Ghi, 345, J, 6]
    

    Ten en cuenta que estamos utilizando afirmaciones de lookbehind para evitar consumir los caracteres que estamos utilizando para dividir la cadena. Específicamente, estamos buscando una letra minúscula Unicode seguida de una mayúscula ((?<=\\p{Ll})(?=\\p{Lu})), un no dígito seguido de un dígito ((?<=\\D)(?=\\d)), o un dígito seguido de un no dígito ((?<=\\d)(?=\\D)).

    Este enfoque debería funcionar para una amplia gama de caracteres Unicode, ya que estamos utilizando las clases de caracteres \p{L} y \p{D} para que coincidan con letras y dígitos respectivamente. Si encuentras algún problema específico con caracteres especiales o scripts no latinos, es posible que debas modificar la expresión regular en consecuencia.

Comments are closed.