2011-05-26 9 views
5

Estoy un poco atrapado en una expresión regular. Considere siguiente código:RegEx para leer múltiples parámetros de multiplicidad desconocida

String regFlagMulti = "^(\\[([\\w=]*?)\\])*?$"; 
    String flagMulti = "[TestFlag=1000][TestFlagSecond=1000]"; 
    Matcher mFlagMulti = Pattern.compile(regFlagMulti).matcher(flagMulti); 

    if(mFlagMulti.matches()){ 
     for(int i = 0; i <= mFlagMulti.groupCount(); i++){ 
      System.out.println(mFlagMulti.group(i)); 
     } 
    }else{ 
     System.out.println("MultiFlag didn't match!"); 
    } 

Lo que quiero es un patrón regular que me da el texto dentro del []; cada uno en un grupo del objeto Matcher resultante.

Importante: ¡No sé cuántas expresiones [] hay dentro de la cadena de entrada!

Para el código anterior se da salida:

[TestFlag=1000][TestFlagSecond=1000] 
[TestFlagSecond=1000] 
TestFlagSecond=1000 

no puede obtener el patrón regular para trabajar. Alguien una idea?

+0

Esto no está en el punto, pero en lugar de '([\\ w =] *?)', Quizás '([^ \\]] *)' también lo haría. –

Respuesta

3

Lo que quiero es un patrón regular que me da el texto dentro de la []; cada uno en un grupo del objeto Matcher resultante.

Desafortunadamente esto no se puede hacer con el motor de expresiones regulares Java. Ver mi pregunta (similar) aquí:


Este grupo:

(\\[([\\w=]*?)\\])* 
\________________/ 

es el grupo número 1 y siempre contendrá el último partido para ese grupo.


He aquí una sugerencia de una solución, que también va a buscar las claves/Vals:

String regFlagMulti = "(\\[(\\w*?)=(.*?)\\])"; 
String flagMulti = "[TestFlag=1000][TestFlagSecond=1000]"; 
Matcher mFlagMulti = Pattern.compile(regFlagMulti).matcher(flagMulti); 

while (mFlagMulti.find()) { 
    System.out.println("String: " + mFlagMulti.group(1)); 
    System.out.println(" key: " + mFlagMulti.group(2)); 
    System.out.println(" val: " + mFlagMulti.group(3)); 
    System.out.println(); 
} 

Salida:

String: [TestFlag=1000] 
    key: TestFlag 
    val: 1000 

String: [TestFlagSecond=1000] 
    key: TestFlagSecond 
    val: 1000 
3

Utilice un patrón que coincida con un solo elemento en la cadena y use Matcher.find() para iterar sobre toda la cadena.

3

Puede intentar lo siguiente:

String regFlagMulti = "\\[(\\w+=.*?)\\]"; 
String flagMulti = "[TestFlag=1000][TestFlagSecond=1000]"; 
Matcher mFlagMulti = Pattern.compile(regFlagMulti).matcher(flagMulti); 
while(mFlagMulti.find()){ 
    System.out.println(mFlagMulti.group(1)); 
} 

de salida:

TestFlag=1000 
TestFlagSecond=1000 
0

Como Aaron señaló correctamente, utilice un grupo (que son estáticos con el patrón, las repeticiones no se añaden como grupos adicionales) y llaman find.

El patrón de usar podría ser así: \G\[([^\]]*)\](?=\[|$)

Grupo 1 contendrá entonces el texto dentro del [].

Notas:

\G sigue el partido en el último partido terminó

(?= es una búsqueda positiva hacia delante para asegurarse de que el final del patrón es el esperado (por ejemplo, ya sea al final de la cadena , o el siguiente [).

Cuestiones relacionadas