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