2009-08-05 23 views
5

Estoy usando el método de escaneo de Ruby() para buscar texto en un formato particular. Luego lo envío a una cadena separada por comas. El texto que estoy tratando de encontrar sería el siguiente:ruby ​​regex .scan

AB_ABCD_123456

Aquí está el lo que he encontrado hasta el momento para encontrar el anterior. Funciona bien:

text.scan(/.._...._[0-9][0-9][0-9][0-9][0-9][0-9]/) 
puts text.uniq.sort.join(', ') 

Ahora necesito una expresión regular que encontrará lo anterior con o sin una designación de país de dos letras al final. Por ejemplo, me gustaría ser capaz de encontrar los tres de los siguientes:

AB_ABCD_123456
AB_ABCD_123456UK
AB_ABCD_123456DE

Sé que podría utilizar dos o tres exploraciones diferentes para lograr mi resultado, pero yo Me pregunto si hay una forma de obtener los tres con una expresión regular.

Respuesta

12
/.._...._[0-9][0-9][0-9][0-9][0-9][0-9](?:[A-Z][A-Z])?/ 

También puede utilizar {} para hacer más corta la expresión regular:

/.{2}_.{4}_[0-9]{6}(?:[A-Z]{2})?/ 

Explicación: ? hace que el patrón anterior opcional. () agrupa las expresiones juntas (por lo que ruby ​​sabe que el ? se aplica a las dos letras). El ?: después de la apertura ( hace que el grupo no se capture (los grupos de captura cambiarían los valores producidos por el escaneo).

+0

funciona bien, gracias, y los accesos directos ayudarán. – michaelmichael

1
/.._...._\d{6}([A-Z]{2})?/ 
+1

Si no hace que el grupo no capture, el escaneo solo arrojará los códigos de país (o cero para las cadenas que no incluyeron uno), no toda la cadena que se combinó. – sepp2k

1

¿Por qué no usar splits?

"AB_ABCD_123456".split(/_/).join(',') 

Maneja las cajas que enumeró sin modificaciones.

+0

AFAIK, el OP intenta encontrar una lista de estos códigos ... no funciona con solo uno. –

+1

Sí; Vi el ejemplo y salté los detalles, un hábito terrible. Perdón por la confusion. – ezpz

1

Prueba esto:

text.scan(/\w{2}_\w{4}_\d{6}\w{0,2}/) 
#matches AB_ABCD_123456UK or ab_abcd_123456uk and so on... 

o

text.scan(/[A-Z]{2}_[A-Z]{4}_\d{6}[A-Z]{0,2}/) 
# tighter, matches only AB_ABCD_123456UK and similars... 
# and not something like ab_aBCd_123456UK or ab_abcd_123456uk and similars... 

se refieren a estas direcciones:

Ruby gsub/regex modifiers?

http://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#regexp

si desea obtener más información sobre regex.

+0

me gusta ese segundo ejemplo de expresiones regulares. gracias por los enlaces. los he revisado, aunque no tan a fondo como debería. los problemas de la vida real me ayudan a entender mucho. – michaelmichael