2009-06-22 14 views
15

Parece que me he confundido con una expresión regular preg_match que estoy haciendo, por lo que los ojos frescos y la ayuda serán apreciados.Regex ¿Grupos opcionales?

Mi expresión regular actual es la siguiente:

/<!--menu:start:\(([0-9])\,([0-9])\)-->(.*?)<!--menu:end-->/se 

Busco para hacer el ingreso de números y el colon, por ejemplo, : (1,4) opcional, por lo que se correspondería con:

<!--menu:start--><!--menu:end--> 

o

<!--menu:start:(0,3)--><!--menu:end--> 

Respuesta

30

Es cercano con un grupo no coincidente y configurarlo para opcional: (?:...)?

/<!--menu:start(?::\(([0-9])\,([0-9])\))?-->(.*?)<!--menu:end-->/se 
27

De esta manera:

/<!--menu:start(?::\((\d),(\d)\))?-->(.*?)<!--menu:end-->/se 

He añadido un grupo sin captura, (?:), alrededor de la parte que desea que sea opcional, y luego con el sufijo con un signo de interrogación: (?:<optional content>)?

+0

Jaja , eso es un lazo cercano ... :) – glmxndr

+0

De hecho, es =) – Blixt

+0

Gracias chicos :) Tuve que elegir uno! – Joel

5

Este utiliza una captura no de grupo opcional - (?:)? - para que coincida con su parte opcional, y también \d en lugar de [0-9] para que coincida con los dígitos:

/<!--menu:start(?::\((\d),(\d)\))?-->(.*?)<!--menu:end-->/se 

Si los números entre paréntesis pueden constar de más de un dígito, utilice éste en su lugar:

/<!--menu:start(?::\((\d+),(\d+)\))?-->(.*?)<!--menu:end-->/se 
+0

¿Hay alguna ventaja al usar \ d en lugar de [0-9]? – Joel

+0

Ninguno en realidad, excepto que \ d es más corto. :-) – Helen

+0

Consulte http://stackoverflow.com/questions/890686/should-i-use-d-or-0-9-to-match-digits-in-a-perl-regex para conocer las diferencias de \ d y [0-9] – ParoX

Cuestiones relacionadas