Pregunta Regex cómo hacer coincidir un personaje opcional


Tengo una expresión regular que creí que estaba funcionando correctamente hasta ahora. Necesito unirme a un personaje opcional. Puede estar allí o no.

Aquí hay dos cuerdas. La cadena superior coincide mientras que la inferior no. La ausencia de una sola letra en la cadena inferior es lo que lo hace fallar.

Me gustaría obtener una sola letra después de los 5 dígitos iniciales si está allí y si no, continúe obteniendo el resto de la cadena. Esta carta puede ser A-Z.

Si elimino ([A-Z]{1}) +.*? + de la expresión regular, coincidirá con todo lo que necesito excepto la letra pero es algo importante.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

Aquí está la expresión regular que estoy usando.

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

76
2017-10-24 06:34


origen


Respuestas:


Utilizar

[A-Z]?

para hacer la carta opcional. {1} es redundante (Por supuesto que también podrías escribir [A-Z]{0,1} lo que significaría lo mismo, pero eso es lo que ? está ahí para.)

Puede mejorar su expresión regular a

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

Y, dado que en la mayoría de los dialectos de expresiones regulares, \d es lo mismo que [0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

Pero: ¿realmente necesitas 11 grupos de captura separados? Y si es así, ¿por qué no captura el cuarto o último grupo de dígitos?


142
2017-10-24 06:44



Puede hacer que la letra simple sea opcional agregando un ? después de eso como:

([A-Z]{1}?)

El cuantificador {1} es redundante para que puedas soltarlo.


13
2017-10-24 06:42



También debe marcar la letra simple como opcional:

([A-Z]{1})? +.*? +

o hacer toda la parte opcional

(([A-Z]{1}) +.*? +)?

4
2017-10-24 06:44