2012-09-17 8 views
12

Esta es una cadena de ejemplo:¿Cómo puedo hacer que parte de una coincidencia de expresiones regulares sea opcional?

123456#p654321 

Actualmente, estoy usando este partido para capturar 123456 y 654321 en dos grupos diferentes:

([0-9].*)#p([0-9].*) 

Pero en ocasiones, la parte #p654321 de la cadena no estará allí, así que solo querré capturar el primer grupo. Traté de hacer que el segundo grupo fuera "opcional" añadiéndole ?, que funciona, pero solo mientras haya un #p al final de la cadena restante.

¿Cuál sería la mejor manera de resolver este problema?

Respuesta

33

Tiene el #p fuera del grupo de captura, lo que lo convierte en una pieza requerida del resultado. También está utilizando el carácter de punto (.) incorrectamente. Dot (en la mayoría de las variantes de reg-ex) coincidirá con cualquier personaje. Cambiarlo a:

([0-9]*)(?:#p([0-9]*))? 

La sintaxis (?:) es como se obtiene un grupo no captura. Luego capturamos solo los dígitos que le interesan. Finalmente, hacemos que todo sea opcional.

Además, la mayoría de las variantes de reg-ex tienen una clase de caracteres \d para los dígitos. Por lo que podría simplificar aún más:

(\d*)(?:#p(\d*))? 

Como otra persona ha señalado, el operador * potencialmente podría igualar a cero dígitos. Para evitar esto, utilice el operador + lugar:

(\d+)(?:#p(\d+))? 
+0

lo he intentado con anterioridad, y funciona sin embargo si hay una segunda parte de la cadena a continuación, el primer grupo es toda la cadena, y nada es en el segundo grupo – user1447941

+0

El punto en su reg-ex está causando su problema. Ver mi revisión. –

+0

Y ahora el segundo grupo es '# p654321'. Es visible que es una parte del partido de grupo. – user1447941

4

Su expresión regular en realidad no coincidir dígitos, debido a que usted ha utilizado en lugar de *+.
Esto es lo que (creo) que desea:

(\d+)(?:#p(\d+))? 
+0

Estás en lo correcto; el '+' sería un mejor operador para usar. Pensé en hacer ese cambio, pero el OP no especificó si los escenarios sin dígitos eran una posibilidad. Como tal, traté de mantenerlo lo más cercano posible a su original. –

Cuestiones relacionadas