Ruby 如何有条件地替换前缀或前缀/后缀gsub
我有两箱需要gsub的字符串: 前缀总是相同的:exRuby 如何有条件地替换前缀或前缀/后缀gsub,ruby,regex,Ruby,Regex,我有两箱需要gsub的字符串: 前缀总是相同的:exxxx 中间可以是hhh或yyy 'xxx-hhh-111' 'xxx-yyy-aaa' 在这两种情况下,我需要做的是始终删除前缀:xxx,这样就可以了: 'xxx-yyy-aaa'.gsub('xxx', '') 结果: '-yyy-aaa' 但有时我需要检查主体是否为hhh,如果为真,则删除前缀和后缀(模式是后缀将是随机数字) 我想我可以用正则表达式来完成这个,有什么想法吗 因此,当字符串为xxx-hhh-111时,我要寻找的结果是:
xxx
中间可以是hhh
或yyy
'xxx-hhh-111'
'xxx-yyy-aaa'
在这两种情况下,我需要做的是始终删除前缀:xxx
,这样就可以了:
'xxx-yyy-aaa'.gsub('xxx', '')
结果:
'-yyy-aaa'
但有时我需要检查主体是否为hhh
,如果为真,则删除前缀和后缀(模式是后缀将是随机数字)
我想我可以用正则表达式来完成这个,有什么想法吗
因此,当字符串为xxx-hhh-111
时,我要寻找的结果是:
'hhh'
简单的方法是两条语句,第一条语句总是删除我上面使用的xxx
只需检查hhh
是否存在,如果存在,则返回hhh
ex:
if 'xxx-hhh-111'.include('hhh')
'hhh'
但如果我能用一条语句完成这两种情况,那就太好了……1)
(二)
但如果我能用一条语句完成这两种情况,那就太好了
为什么?您应该能够使用
xxx(-hhh-|-\w{3}-.*).*
并替换为第一个捕获组,即
data.gsub(/xxx(-hhh-|-\w{3}-.*).*/, "\\1")
其中数据是字符串
问候
编辑:注意到您不需要hhh
的连字符。使用
xxx-?(hhh|-\w{3}-.*).*
相反地 我们不要想得太多:
def extract(str, target)
middle = str[4,3]
middle == target ? middle : str[3..-1]
end
extract("cat-hhh-123", "hhh") #=> "hhh"
extract("cat-dog-123", "hhh") #=> "-dog-123"
您可以依赖捕获组:不使用另一个字符串替换匹配的字符串,而是使用一个捕获组(由括号分隔)作为您要查找的结果
"xxx-hhh-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> 'hhh'
"xxx-yyy-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> '-yyy-mmm'
“\1”
这里指的是第一个捕获组内的模式匹配:要么(hhh)要么(.*)对不起,我必须解决我的问题。。。但是。比赛是好的,不知道,会研究。
def extract(str, target)
middle = str[4,3]
middle == target ? middle : str[3..-1]
end
extract("cat-hhh-123", "hhh") #=> "hhh"
extract("cat-dog-123", "hhh") #=> "-dog-123"
"xxx-hhh-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> 'hhh'
"xxx-yyy-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> '-yyy-mmm'