2017-06-10 2 views
0

Ich habe ein Attribut, das ich oft mit "category-" beginnen soll.Ruby - Nach Zeichenkette suchen und dann Substring nehmen

Zum Beispiel:

@category = "category-ruby-on-rails" 

Wie kann ich überprüfen, ob @category mit "category-" beginnt und dann, wenn es sich nur um den Wert nach "category-" (das heißt "ruby on rails" in diesem Beispiel) der Fall ist, bekommen?

+0

Sie könnten überprüfen, werden sie immer "einige Wörter getrennt durch Bindestrich" sein? egal ob das mit 'category-' beginnt? –

Antwort

3

Hier sind zwei Möglichkeiten, die einen regulären Ausdruck verwenden. (In beiden wird nil zurückgegeben, wenn es keine Übereinstimmung gibt.)

str = "category-ruby-on-rails" 

str[/(?<=\Acategory-).*/] 
    #=> "ruby-on-rails" 

str[/\Acategory-(.*)/, 1] 
    #=> "ruby-on-rails" 

(?<=\Acategory-) ist ein positive Lookbehind. Das bedeutet, dass "category-" am Anfang der Zeichenfolge (\A) übereinstimmen muss, aber es ist nicht Teil der Übereinstimmung, die zurückgegeben wird.

(.*) speichert .* in Einfanggruppe 1. Das zweite Argument der Instanzmethode String#[] ist die Capture-Gruppe, deren Inhalt abgerufen und durch das Verfahren zurückgeführt werden.

Wir könnten auch String#gsub verwenden:

s = str.gsub(/\Acategory-/, '') 
    #=> "ruby-on-rails" 

sondern müssen prüfen, ob es eine Übereinstimmung gewesen war. Zum Beispiel

s == str 
    #=> false (meaning the match was performed) 

Es gibt viele andere Möglichkeiten, dies zu tun, einschließlich einiger, die keinen regulären Ausdruck verwenden.

s = "category-" 
str[s.size..-1] if str.start_with?(s) 
    #=> "ruby-on-rails" 

str = "division-ruby-on-rails" 
str[s.size..-1] if str.start_with?(s) 
    #=> nil 
+0

Es scheint, dass Sie alles mit Regexp lösen können. Nett! – Gerry

2

Sie können prüfen, ob @Category mit "Kategorie-" beginnt, wenn so nur Sie Ihre Zeichenfolge aufgeteilt, fallen sein erstes Element und kommen

result = false 
if @category.start_with?("category-") 
    result = @category.split("-").drop(1).join("-") 
end 

Die "one-line" Version:

result = @category.start_with?("category-") ? @category.split("-").drop(1).join("-") : false 
Verwandte Themen