Ruby - 检查String然后Take Substring

时间:2017-06-10 21:16:12

标签: ruby-on-rails ruby

我有一个属性,我希望通常以"category-"开头。

例如:

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

如何检查@category是否以"category-"开头,如果是,则仅获取"category-"之后的值(在此示例中为"ruby on rails")?< / p>

2 个答案:

答案 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