2009-08-05 13 views
5

Używam metody scan() w celu znalezienia tekstu w określonym formacie. Następnie wyprowadzam go do łańcucha oddzielonego przecinkami. Tekst próbuję znaleźć wyglądałby następująco:ruby ​​regex .scan

AB_ABCD_123456

Oto co mam wymyślić tak daleko, aby znaleźć powyżej. Działa to dobrze:

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

Teraz potrzebuję wyrażeń regularnych, które znajdą powyższe z lub bez dwuliterowego oznaczenia kraju na końcu. Na przykład chciałbym być w stanie znaleźć wszystkie trzy poniżej:

AB_ABCD_123456
AB_ABCD_123456UK
AB_ABCD_123456DE

wiem, mogę korzystać z dwóch lub trzech różnych skanów osiągnąć mój wynik, ale jestem Zastanawiam się, czy istnieje sposób na uzyskanie wszystkich trzech za pomocą jednego wyrażenia regularnego.

Odpowiedz

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

Można również użyć {}, aby regex krócej:

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

Objaśnienie: ? czyni poprzedzający wzór opcjonalne. () grup wyrażeń razem (tak rubin zna ? dotyczy dwóch liter). ?: po otwarciu ( powoduje, że grupa nie przechwytuje (przechwytywanie grup zmieni wartości otrzymane przez skanowanie).

+0

działa dobrze, dziękuję, a skróty pomogą. – michaelmichael

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

Jeśli nie wykonasz skanowania bez przechwytywania grupy, otrzymasz tylko kody krajów (lub zero dla łańcuchów, które nie zawierały), a nie cały ciąg, który został dopasowany. – sepp2k

1

Dlaczego po prostu nie używać podziału?

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

Obsługuje wymienione przypadki bez modyfikacji.

+0

AFAIK, OP próbuje znaleźć listę tych kodów ... nie działa z jednym. –

+1

Tak; Widziałem przykład i przeskoczyłem obok szczegółów - okropny nawyk. Przepraszam za zamieszanie. – ezpz

1

Spróbuj tego:

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

lub

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

odnoszą się do tych adresów URL:

Ruby gsub/regex modifiers?

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

, jeśli chcesz dowiedzieć się więcej o regex.

+0

Podoba mi się ten drugi przykład regex. dzięki za linki. Przeszedłem przez nie, choć nie tak dokładnie, jak powinienem. prawdziwe problemy życiowe bardzo pomagają mi zrozumieć. – michaelmichael