Ruby 如何有条件地替换前缀或前缀/后缀gsub

Ruby 如何有条件地替换前缀或前缀/后缀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时,我要寻找的结果是:

我有两箱需要gsub的字符串:

前缀总是相同的:ex
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'