Tengo el script aquí con múltiples "(" y ")":

#if( a == b && a == c ) Content 1 #elseif( ( a == b ) && (a != c) ) Content 2 #elseif( (a != b) && (a != c) ) Content 3 #end

Y quiero usar java.util.regex.Pattern para obtener la condición de este script. Y el resultado que quiero:

  • si (a == b && a == c)

  • elseif ((a == b) && (a! = c))

  • elseif ((a! = b) && (a! = c))

Tengo usando: Pattern pattern = Pattern.compile ("(# if | #elseif) + (. *?) ((([^)]) {1,}))"); Pero el resultado no se esperaba. Por favor, ayúdame con la expresión regular aquí. Muchas gracias.

0
Ben Jima 11 oct. 2017 a las 07:39

2 respuestas

La mejor respuesta

Prueba este Regex:

(?:if|elseif)\s*\((?:[^()]+\)|.*?\)(?:\s*\))+)

Haga clic para demostración

Explicación:

  • (?:if|elseif): coincide con if o elseif
  • \s*: coincide con más de 0 apariciones de un carácter de espacio en blanco
  • [^()]+\): coincide con 1 o más ocurrencias de cualquier carácter que no sea ( ni ). A esto le sigue un ) coincidente
  • | - O
  • .*?\)(?:\s*\))+: maneja el caso con paréntesis anidados ()

Expresión actualizada:

#(?:if|elseif)\s*\((?:[^()]*\)|[^#]+\))

1
Potatoツ 13 oct. 2017 a las 11:30

Desafortunadamente, Java no admite la recursividad, por lo que no puede hacer coincidir correctamente los grupos entre paréntesis equilibrados. Si no espera que la parte posterior a las condiciones if / elseif alguna vez contenga paréntesis, puede utilizar la siguiente solución alternativa:

(?m)^#(?:if|elseif).*? (?!.*[()])(.+)
1
jaytea 11 oct. 2017 a las 08:40