2009-10-17 17 views
15

Korzystanie Ruby ... biorąc pod uwagę następujący ciąg:Jak znaleźć ostatnie wystąpienie liczby w ciągu znaków przy użyciu Ruby?

x = "blah_blah.do.dah[4543]junk_junk" 

Jak mogę usunąć cały tekst po ostatniej cyfrze numeru /?

Myślałem, że najłatwiejszym sposobem na to może być znalezienie indeksu ostatniego wystąpienia, a następnie usunięcie wszystkiego po tym indeksie. Jednak nie mogę się dowiedzieć, jak uzyskać ten indeks. Wszystkie moje próby użycia wyrażenia regularnego nie powiodły się.

Odpowiedz

28

Istnieją odpowiedzi, jak to zrobić, co trzeba

także znaleźć ostatnie wystąpienie numer:

x = 'blah_blah.do.dah[4543]junk_junk' 
x.rindex(/\d/) 
+0

Dzięki. Z jakiegoś powodu, który nie zadziałał, spróbowałem ... Musiałem mieć nieco niepoprawną składnię. Połączenie tego z gsub działało pięknie. – Chadwick

3

ten jest prawdopodobnie regex szukasz:

s/\D*$// 

Ten regex dopasowuje wszystkie non-cyfr na końcu łańcucha, zaczynając od ostatniej cyfry lub początku łańcucha (jeśli nie zawiera żadnych cyfr) i usuwa wszystko, co jest dopasowane. Dokładniej, \D* to dopasowanie dla dowolnej liczby nie będących cyframi (zero lub więcej). $ reprezentuje koniec napisu.

W Ruby można użyć metody ciąg gsub do wyszukiwania i zamiany za pomocą wyrażenia regularnego:

x = 'blah_blah.do.dah[4543]junk_junk' 
y = x.gsub(/\D*$/, '') 

Aby uzyskać więcej informacji na temat regexes i Ruby, zobacz regular-expressions.info.

+0

Prawdopodobnie po prostu chcesz/\ D + $/(lub/\ D + \ Z /) - PO chciała rozebrać non-cyfry od końca. –

+0

@Glenn: doh, masz rację ... Zaktualizuję odpowiedź. – Stephan202

0

zakładam chcesz dołączyć ostatni ']' po numerze

Oto moja odpowiedź:

Original_Text = "blah_blah.do.dah[4543]junk_junk" 
Result___Text = Original_Text.gsub(Regexp.new("(.*\\[[0-9]+\\])[^0-9]*$"), '\1') 
puts Result___Text 

Jeśli nie, spróbuj tego:

Original_Text = "blah_blah.do.dah[4543]junk_junk" 
Result___Text = Original_Text.gsub(Regexp.new("(.*[0-9]+)[^0-9]*$"), '\1') 
puts Result___Text 
+0

Proszę nie używać czapek. – yfeldblum

+0

Czapki? Co masz na myśli? – NawaMan

+0

nazwy zmiennych o LeadingCapital są uważane za stałe w języku Ruby. –

1

Ten regex powinny praca:

(.*(?=\d)\d)[^\d]*$ 

Należy używać coś takiego:

result = your_text.gsub(/(.*(?=\d)\d)[^\d]*$/, '\\1') 

Objaśnienie:

  • (.*(?=\d)\d) jest grupa rzeczą, którą chcesz zapisać
    • .*. jest wszystko z wyjątkiem przerwy linii, * środki 0 lub więcej razy
    • (?=\d) oznacza , dopóki nie będzie można dopasować a \d, która jest cyfrą
    • \d oznacza również tę samą cyfrę!
  • [^\d]+$ jest częścią nie chcesz, aby zapisać
    • w [^\d]* pasuje wszystko, co nie pasuje \d i * jest znowu 0 lub więcej razy
    • $ jest koniec linia

alternatywą mogłoby być po prostu zastępując [^\d]+$ nic

0
irb(main):068:0> "blah_blah.do.dah[4543]junk_junk".match(/(.+\d)/)[1] 
=> "blah_blah.do.dah[4543" 
0
puts "blah_blah.do.dah[4543]junk_junk"[/.*\d+/] 
#returns "blah_blah.do.dah[4543" 

użyciu rindex:

x = "blah_blah.do.dah[4543]junk_junk" 
x.rindex(/\d/) 
puts "#{$`}#{$&}" 
#also returns "blah_blah.do.dah[4543" 
1

W sumie to się wydaje Był to najczystszy, najprostszy sposób na zrobienie tego, czego potrzebowałem. Dziękuję wszystkim za wskazanie mnie we właściwym kierunku!

index = file.rindex(/\d/) 
if(index) then 
    p file[0 , index+1] 
end 
Powiązane problemy