2009-08-05 5 views
5

Ich benutze die scan() -Methode von Ruby, um Text in einem bestimmten Format zu finden. Ich gebe es dann in eine durch Kommas getrennte Zeichenkette aus. Der Text Ich versuche, wie dies aussehen würde, zu finden:ruby ​​regex .scan

AB_ABCD_123456

Hier ist das, was ich mit so weit habe kommen die oben zu finden. Es funktioniert gut:

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

Jetzt brauche ich einen regulären Ausdruck, der die oben mit oder ohne zwei Buchstaben bestehenden Länderbezeichnung am Ende finden wird. Zum Beispiel würde Ich mag Lage sein, alle drei der unten zu finden:

AB_ABCD_123456
AB_ABCD_123456UK
AB_ABCD_123456DE

Ich weiß, dass ich zwei oder drei verschiedene Scans verwenden könnte mein Ergebnis zu erreichen, aber ich Ich frage mich, ob es einen Weg gibt, alle drei mit einer Regex zu bekommen.

Antwort

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

Sie können auch verwenden, {} die Regex kürzer zu machen:

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

Erläuterung: ? macht das vorhergehende Muster optional. () gruppiert Ausdrücke zusammen (so Rubin weiß, die ? gilt für die beiden Buchstaben). Die ?: nach der Eröffnung ( macht die Gruppe nicht erfassen (Capturing-Gruppen würden die Werte durch Scan-Scan ändern).

+0

funktioniert gut, danke, und die Verknüpfungen werden dazu beitragen. – michaelmichael

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

Wenn Sie die nicht erfassende Gruppe nicht erstellen, erhalten Sie nur die Ländercodes (oder null für die Zeichenfolgen, die keine enthalten) und nicht die gesamte übereinstimmende Zeichenfolge. – sepp2k

1

Warum nicht einfach Split verwenden?

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

Verarbeitet die Fälle, die Sie ohne Änderung aufgelistet haben.

+0

AFAIK, das OP versucht, eine Liste dieser Codes zu finden ... nicht mit nur einem zu arbeiten. –

+1

Ja; Ich sah das Beispiel und sprang an den Details vorbei - eine schreckliche Angewohnheit. Entschuldigung für die Verwirrung. – ezpz

1

Versuchen Sie folgendes:

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

oder

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

auf diese URLs verweisen:

Ruby gsub/regex modifiers?

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

Wenn Sie mehr über Regex erfahren möchten.

+0

Ich mag das zweite Regex-Beispiel. Danke für die Links. Ich bin durch sie gegangen, wenn auch nicht so gründlich wie ich sollte. Probleme des wirklichen Lebens helfen meinem Verständnis viel. – michaelmichael