2009-08-05 9 views
5

Uso il metodo scan() di Ruby per trovare testo in un formato particolare. Quindi lo invio in una stringa separata da virgole. Il testo che sto cercando di trovare sarebbe simile a questa:ruby ​​regex .scan

AB_ABCD_123456

Ecco la cosa che è venuta in mente finora per trovare quanto sopra. Funziona bene:

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

Ora ho bisogno di una regex che troverà quanto sopra, con o senza una designazione di due lettere alla fine. Ad esempio, mi piacerebbe essere in grado di trovare tutte e tre le seguenti:

AB_ABCD_123456
AB_ABCD_123456UK
AB_ABCD_123456DE

So che potrei usare due o tre scansioni diverse per raggiungere il mio risultato, ma io' Mi chiedo se c'è un modo per ottenere tutti e tre con una regex.

risposta

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

È inoltre possibile utilizzare {} per rendere il più breve regex:

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

Spiegazione: ? rende il modello precedente opzionale. () raggruppa le espressioni insieme (quindi ruby ​​sa che lo ? si applica alle due lettere). Il ?: dopo l'apertura ( rende il gruppo non acquisibile (i gruppi di acquisizione modificano i valori restituiti dalla scansione).

+0

funziona bene, grazie, e le scorciatoie aiuteranno. – michaelmichael

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

Se non si effettua la scansione di non acquisizione del gruppo, verranno restituiti solo i codici paese (o zero per le stringhe che non ne includevano uno), non l'intera stringa corrispondente. – sepp2k

1

Perché non usare lo split?

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

Gestisce i casi elencati senza modifiche.

+0

AFAIK, l'OP sta cercando di trovare un elenco di questi codici ... non funziona con uno solo. –

+1

Sì; Ho visto l'esempio e ho oltrepassato i dettagli: un'abitudine terribile. Dispiace per la confusione. – ezpz

1

Prova questo:

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... 

si riferiscono a questi URL:

Ruby gsub/regex modifiers?

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

se vuoi saperne di più sulla regex.

+0

mi piace quel secondo esempio di regex. grazie per i link li ho passati attraverso, anche se non così accuratamente come avrei dovuto. i problemi di vita reale aiutano molto la mia comprensione. – michaelmichael