2012-06-11 25 views
28

tengo que dividir la cadenaexpresión regular con -, ::, (y)

(edad-es-25 :: :: O APELLIDOS-is-QA6) :: Y: :(edad es-20 :: O :: FIRST_NAME-contiene-test)

en

string [0] = (edad-es-25 :: O :: last_name-is-QA6)

cadena [1] = AND

cadena [2] = (edad-es-20 :: :: O nombre apellido-contiene-test)

Traté de escribir tantas expresiones de expresiones regulares, pero nada funciona como se esperaba.

Usando la siguiente expresión regular, Matcher.groupCount() que devuelve 2 pero la asignación de resultados a una lista de arrays devuelve nulo como elementos.

Pattern pattern = Pattern.compile ("(\\): :)? | (:: \\()?");

Traté de partirla usando) :: o:. :(

Sé que la expresión regular se ve demasiado estúpida, pero al ser un principiante esto es lo mejor que podría escribir

+3

generalización de este problema es equivalente a las expresiones de análisis con expresión regular, que no es posible: expresión regular no es lo suficientemente potente como para eso. – dasblinkenlight

+8

No es estúpido si realmente has intentado algo :) Excelente trabajo para probar algo antes de preguntar. – Ewald

+0

¿cómo se puede dividir por '::' solo alrededor de 'Y' sin poner ese' Y' en ese divisor ?? – dantuch

Respuesta

36

Puede usar la búsqueda anticipada positiva y mirar hacia atrás para hacer coincidir el primer y el último paréntesis.

String str = "(age-is-25::OR::last_name-is-qa6)::AND::(age-is-20::OR::first_name-contains-test)"; 

for (String s : str.split("(?<=\\))::|::(?=\\()")) 
    System.out.println(s); 

Salidas:

(age-is-25::OR::last_name-is-qa6) 
AND 
(age-is-20::OR::first_name-contains-test) 

Sólo una nota sin embargo: Parece que se está analizando algún tipo de lenguaje recursivo. Las expresiones regulares no son buenas para hacer esto. Si está realizando un análisis avanzado, le recomendaría que consulte otros métodos de análisis sintáctico.

+8

Es curioso cómo este es el primer respondedor que no hace una gran conjetura. Él está claramente más familiarizado con la expresión regular avanzada y aún así las pruebas. El resto es como "prueba esto, y si tienes suerte, funcionará". – MarioDS

+1

@dacwe realmente uno de respuesta inteligente amigo. +1 a él. –

+0

@dacwe: ¡Muchas gracias! Por cierto, lo hago nt entiende el uso de? <= y? = en la expresión regular. Nunca he visto esos en ninguno de los tutoriales. ¿Puedes por favor explicar o puedes indicar alguna url de donde podría obtener algo de información sobre eso? Gracias de nuevo. – aradhak

-1
textString.split("\\)::|::\\(") 
.

debería funcionar.

+0

la barra inclinada viene dos veces ... no sé por qué el formateo está eliminando mi segunda barra invertida – ManojGumber

+3

Si el formateo está jugando con su código, conviértalo en un bloque de código, o use '' 'como este' – dantuch

+0

No incluirá el) en la primera cadena y (en la 3ra secuencia –

-1

Esto debería funcionar para usted.

\)::|::\(
1

Para mí, parece que gran parte de tu estrés proviene de la necesidad de escapar de los caracteres especiales en tu término de búsqueda. Recomiendo encarecidamente no hacer escapes manuales de caracteres especiales, sino usar Pattern.quote(...) para el escapado.

1

Esto si funciona

"(?<=\\))::|::(?=\\()" 
Cuestiones relacionadas