Tengo una expresión regular:

\[[^\[\]]*\]\s*[<>|<=|>=|=|>|<]\s*'?"?\w*'?"?

Esto básicamente analiza una ecuación como:

[household_roster_relationships_topersona_nameadditionalpersono] = "1"

Funciona bien, con

'=','>','<'.

Pero cuando la ecuación tiene

'<=','>=','<>'.

El análisis se detiene en el primer personaje de

'<=','>=','<>'.

He creado una demostración en regex101

¿Cómo puedo corregir la expresión regular para que funcione en esta situación?

2
sh977218 16 feb. 2017 a las 17:51

3 respuestas

La mejor respuesta

Debe reemplazar la clase de caracteres con una construcción de agrupación.

Uso

\[[^[\]]*]\s*(?:<>|[<>]=|[=><])\s*['"]?\w*['"]?
             ^^^              ^     

Consulte la demostración de expresiones regulares. El grupo (?:<>|[<>]=|[=><]) sin captura (solo utilizado para agrupar subpatrones) coincide con <>, <=, >=, =, > o <.

Tenga en cuenta que reduje algunas ramas alternativas para hacer que el patrón sea un poco más compacto. Además, creo que solo desea hacer coincidir ' o " al final, por lo tanto, un mero ['"]? (1 o 0 ' o ") debería ser suficiente.

Además, no necesita escapar de un [ dentro de una clase de caracteres ([[] coincide con un solo [) y no necesita escapar ] fuera de una clase de caracteres, coincide con un símbolo literal ].

1
Wiktor Stribiżew 16 feb. 2017 a las 14:54

Debe usar () en lugar de [] para la selección de clase de caracteres de varias palabras ... ver expresiones regulares actualizadas

0
m87 16 feb. 2017 a las 15:03

Simplemente cambie su clase de caracteres por una alternancia:

\[[^\[\]]*\]\s*(<>|<=|>=|=|>|<)\s*'?"?\w*'?"?
               ^              ^

Ver demo

2
Graham 24 sep. 2017 a las 18:54