2009-08-26 18 views
10

tengo el siguiente patrón:¿Cómo hago coincidir texto entre paréntesis usando expresiones regulares?

(COMPANY) -277.9887 (ASP,) -277.9887 (INC.) 

quiero que el resultado final sea:.

EMPRESA ASP, INC

Actualmente tengo el siguiente código y sigue volviendo al patrón original (asumo porque el grupo de todas las caídas entre el primer '(' y la última ')'

Pattern p = Pattern.compile("((.*))",Pattern.DOTALL); 
Matcher matcher = p.matcher(eName); 
while(matcher.find()) 
{ 
    System.out.println("found match:"+matcher.group(1)); 
} 

estoy luchando para obtener los resultados que necesito y agradezco cualquier ayuda. No estoy preocupado por concatenar los resultados después de obtener cada grupo, solo necesito obtener cada grupo.

Respuesta

28
Pattern p = Pattern.compile("\\((.*?)\\)",Pattern.DOTALL); 
+0

caos, you rock! Nunca pensé en probar ese patrón y funcionó exactamente como lo necesitaba. ¡Gracias por tomarse el tiempo para responder! – northpole

+0

De nada. :) – chaos

0
No

una respuesta directa a su pregunta, pero le recomiendo que utilice RegxTester para llegar a la respuesta y cualquier pregunta futura rápidamente. Le permite probar en tiempo real.

+0

Sin embargo admite expresiones regulares .NET, no java. – wds

6

Su. * Cuantifier es 'codicioso', así que sí, está tomando todo entre el primer y el último paréntesis disponible. Como dice el caos, tersely :), usando el. *? es un cuantificador no codicioso, por lo que agarrará lo menos posible mientras mantiene el fósforo.

Y necesita escaparse del paréntesis dentro de la expresión regular, de lo contrario se convierte en otro grupo. Eso es suponiendo que haya un paréntesis literal en su cadena. Sospecho a qué se refería en la pregunta inicial ya que su patrón es de hecho su cadena.

Consulta: son "COMPAÑÍA", "ASP" e "INC". requerido?

Si debe tener valores para ellos, entonces quiere usar + en lugar de *, + es 1 o más, el * es cero o más, por lo que a * coincidiría con la cadena literal "()"

por ejemplo: '((+.?))'

+0

este es un gran consejo, gracias, solo tendré() si de hecho hay un valor entre ellos. Pero marcaré esto para el futuro. ¡Gracias! – northpole

+0

Puede y posiblemente debería intentar ser más específico que '.' en la coincidencia de tus grupos también. Si se espera que la secuencia tenga solo letras mayúsculas y tal vez la puntuación ilustrada, entonces puede intentar algo como "\\ (([A-Z,.] +?) \\)". De esta manera, los datos dudosos son al menos notados y pueden corregirse. – ptomli

0

Si sus cadenas son siempre va a parecer que, usted podría salirse con sólo usar un par llama a replaceAll lugar. Esto parece funcionar para mí:

String eName = "(COMPANY) -277.9887 (ASP,) -277.9887 (INC.)"; 
     String eNameEdited = eName.replaceAll("\\).*?\\("," ").replaceAll("\\(|\\)",""); 
     System.out.println(eNameEdited); 

Probablemente no sea la cosa más eficiente en el mundo, pero bastante simple.

1

Probado con Java 8: /** * Debajo del patrón regresa la cadena dentro de los paréntesis.

* Description about casting regular expression: \(+\s*([^\s)]+)\s*\)+ 

* \(+ : Exactly matches character "(" at least once 
* \s* : matches zero to any number white character. 
* (: Start of Capturing group 
* [^\s)]+: match any number of character except ^,) and spaces. 
*) : Closing of capturing group. 
* \s*: matches any white character(0 to any number of character) 
* \)*: Exactly matches character ")" at least once. 


private static Pattern REGULAR_EXPRESSION = Pattern.compile("\\(+\\s*([^\\s)]+)\\s*\\)+"); 
Cuestiones relacionadas