如何使用像字符串模板这样的正则表达式替换?

时间:2015-08-12 16:12:27

标签: ruby regex string

所以这是场景。我有一个用户定义的正则表达式存储在变量 public IQuerable<Customer> GetValidCustomer() { return _customerRepository.Where(...); } var viewModel = _customerServices.GetValidCustomer().Project.To<MaValidCustomerViewModel>().FirstOrDefault(); 中。除了名为my_regex的命名组之外,我应该没有其他知识。例如,一个有效的正则表达式可能是:

id

我尝试这样做:将此正则表达式与字符串匹配,并将组my_regex = /ABC(?<id>...)ABC/ 替换为固定字符串id。例如:

'123'

现在我知道如果我自己定义正则表达式就可以做到这一点,例如,我可以将my_func(my_regex, 'ABC789ABCQQQQ') #=> 'ABC123ABCQQQQ' 定义为my_regex,然后使用

/(ABC)(...)(ABC)/

然而,除了我不是那个定义它的人之外,这个解决方案很丑陋而且不可推广。如果不是my_match_data = my_regex.match('ABC789ABCQQQQ') result = my_match_data.captures[0] + '123' + my_match_data.captures[2] 而是idid1id2,而是任意顺序,该怎么办?

我正在寻找像正则表达式的字符串模板一样优雅的东西,例如,想象:

id3

有没有办法以类似的方式实现这一目标?

2 个答案:

答案 0 :(得分:0)

好的,我还是找不到内置的解决方案。所以这是一个简单的扩展,可以实现一些接近的目标。

class MatchData
  def %(hash)
    string_copy = string.dup
    hash.each do |key, value|
      string_copy[self.begin(key)..self.end(key)] = value
    end
    string_copy
  end
end

my_regex = /ABC(?<id>...)ABC/
puts my_regex.match('ABC789ABCQQQQ') % {id: '123'}

答案 1 :(得分:0)

你可以这样做:

regex = /1(?<cat>[a-z]+)2ABC(?<id>\d+)ABC/
str = '21dog2ABC789ABCQQQQ'
name = :id   
replacement = '123'

m = regex.match(str)
  #=> #<MatchData "1dog2ABC789ABC" cat:"dog" id:"789">
i = m.begin(name)
  #=> 9
str[0,i] + replacement + str[i+m[name].size..-1]
  #=> "21dog2ABC123ABCQQQQ"