2011-03-19 16 views
7

Necesito dividir una cadena donde hay una coma, pero depende de dónde se coloca la coma.java - cadena dividida usando la expresión regular

Como ejemplo

en cuenta lo siguiente:

C=75,user_is_active(A,B),user_is_using_app(A,B),D=78 

me gustaría la función String.split() separarlos así:

C=75 

user_is_active(A,B) 

user_using_app(A,B) 

D=78 

sólo puedo pensar en una cosa, pero No estoy seguro de cómo se expresaría en expresiones regulares.

Los caracteres/palabras entre corchetes siempre son mayúsculas. En otras palabras, no habrá una situación en la que tenga user_is_active(a,b).

¿Hay alguna forma de hacerlo?

Respuesta

12

Si no tiene más de un nivel de paréntesis, se puede hacer una división en un coma que no vaya seguida de un cierre ) antes de una abertura (:

String[] splitArray = subjectString.split(
    "(?x), # Verbose regex: Match a comma\n" + 
    "(?!  # unless it's followed by...\n" + 
    " [^(]* # any number of characters except (\n" + 
    " \\) # and a)\n" + 
    ")  # end of lookahead assertion"); 

Su regla propuesta traducen como

String[] splitArray = subjectString.split(
    "(?x),  # Verbose regex: Match a comma\n" + 
    "(?<!\\p{Lu}) # unless it's preceded by an uppercase letter\n" + 
    "(?!\\p{Lu}) # or followed by an uppercase letter"); 

pero entonces se perdería una división en un texto como

Org=NASA,Craft=Shuttle 
+0

¡esto funciona prefecto! ¡No creo que tenga más de un paréntesis de nivel! ¡Gracias! : D – kkudi

+0

Eso es mucho más inteligente que el ciclo que tenía en mente. –

+1

+1 Y si el constructo '(A, B)' solo tiene una coma dentro, puede acelerarlo drásticamente agregando una coma a la expresión '[^ (] *', es decir, '[^ (,] * '. – ridgerunner

0

considere utilizar un generador de analizador para analizar este tipo de consulta. E.g: javacc o antlr

0

Como alternativa, si necesita más de un nivel de paréntesis, puede crear un pequeño analizador de cadenas para analizar la cadena carácter por carácter.

Cuestiones relacionadas