所以这是场景。我有一个用户定义的正则表达式存储在变量 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]
而是id
,id1
和id2
,而是任意顺序,该怎么办?
我正在寻找像正则表达式的字符串模板一样优雅的东西,例如,想象:
id3
有没有办法以类似的方式实现这一目标?
答案 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"