我有一个属性,我希望通常以"category-"
开头。
例如:
@category = "category-ruby-on-rails"
如何检查@category
是否以"category-"
开头,如果是,则仅获取"category-"
之后的值(在此示例中为"ruby on rails"
)?< / p>
答案 0 :(得分:3)
以下是使用正则表达式的两种方法。 (如果没有匹配,则返回nil
。)
str = "category-ruby-on-rails"
str[/(?<=\Acategory-).*/]
#=> "ruby-on-rails"
str[/\Acategory-(.*)/, 1]
#=> "ruby-on-rails"
(?<=\Acategory-)
是一个积极的背后隐藏。这意味着"category-"
必须在字符串的开头(\A
)匹配,但它不是返回的匹配的一部分。
(.*)
将.*
保存到捕获组1中。实例方法String#[]的第二个参数是捕获组,其内容将由方法检索并返回。
我们也可以使用String#gsub:
s = str.gsub(/\Acategory-/, '')
#=> "ruby-on-rails"
但需要检查是否有匹配。例如,
s == str
#=> false (meaning the match was performed)
还有很多其他方法可以做到这一点,包括一些不使用正则表达式的方法。
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
答案 1 :(得分:2)
您可以检查@category是否以“category-”开头,如果是这样,您只需拆分字符串,删除其第一个元素并加入
result = false
if @category.start_with?("category-")
result = @category.split("-").drop(1).join("-")
end
“单行”版本:
result = @category.start_with?("category-") ? @category.split("-").drop(1).join("-") : false