如何将字符串与模式匹配并从中提取值?

时间:2017-05-21 10:49:17

标签: ruby-on-rails ruby

在我的Rails应用程序中,我正在寻找一种使用模式返回字符串的某些部分的方法。

get_value(string: "21-05-2017-01", pattern: "DD-MM-YYYY-NN", substring: "NN") # => "01"
get_value(string: "21-05-2017-01", pattern: "DD-MM-YYYY-NN", substring: "MM") # => "05"

模式中N s的数量和位置可能会有所不同。

如何做到这一点?

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

这可能和你想要的一样复杂。但是一个简单的实现可能是。

nodes

答案 1 :(得分:1)

试试这个:

def get_value(hash = {})
  hash[:pattern].split('-').zip(hash[:string].split('-')).map { |k,v| v if k == hash[:substring] }.compact.first
end

您可以将其称为

get_value({string: "21-05-2017-01", pattern: "DD-MM-YYYY-NN", substring: "NN"})
# => "01"

答案 2 :(得分:1)

获得" NN"的位置ins" DD-MM-YYYY-NN"它会是

my_index = "DD-MM-YYYY-NN".index("NN")

获得索引后,可以从字符串...

中提取索引(适当的长度)
result = "21-05-2017-01"[my_index, "NN".size]
=> "01"

将所有内容放在一起(并处理子字符串不匹配的情况)...

def get_value(options)
  return nil if (my_index = options[:pattern].index[options[:substring]) == nil
  string[my_index, options[:substring].size)
end

答案 3 :(得分:1)

还有一个解决方案:)

def get_value(string:, pattern:, substring:)
  pattern_select = pattern.split('-').zip(string.split('-')).to_h # => {"DD"=>"21", "MM"=>"05", "YYYY"=>"2017", "NN"=>"01"}
  pattern_select.fetch(substring, "Undefined substring: #{substring}")
end