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

时间:2015-11-05 11:13:38

标签: ruby regex

我有2个字符串我需要gsub:

前缀始终相同:ex xxx 中间可以是hhhyyy

'xxx-hhh-111'
'xxx-yyy-aaa'

在这两种情况下我需要做的是始终删除前缀:xxx,这样就可以了:

'xxx-yyy-aaa'.gsub('xxx', '')

结果:

'-yyy-aaa'

但有时我需要检查正文是否为hhh,如果为true,则删除前缀和后缀(模式是后缀为随机数字)

我想我可以用正则表达式来完成这个任何想法吗?

所以当字符串为xxx-hhh-111时,我正在寻找的结果是:

'hhh'

简单的方法是2个语句,第一个总是删除上面使用的xxx

只需检查是否存在hhh,如果存在,则返回hhh例如:

if 'xxx-hhh-111'.include('hhh')
  'hhh'

但如果我能用1个语句完成这两个案例,那就太好了......

4 个答案:

答案 0 :(得分:1)

您可以依赖捕获组:您可以使用一个由括号分隔的捕获组,而不是将匹配的字符串替换为另一个捕获组,作为您要查找的结果。

"xxx-hhh-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> 'hhh'
"xxx-yyy-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> '-yyy-mmm'

'\1'这里指的是第一个捕获组内的模式匹配:(hhh)或(。*)

答案 1 :(得分:0)

1)

0000-00-00

2)

STR_TO_DATE()
  

但如果我能用1个语句完成两个案例,那就太好了。

为什么?

答案 2 :(得分:0)

您应该可以使用

执行此操作
xxx(-hhh-|-\w{3}-.*).*

并替换为第一个捕获组,即

data.gsub(/xxx(-hhh-|-\w{3}-.*).*/, "\\1")

其中数据是您的字符串。

此致

Example here

修改:注意到您不想要hhh的连字符。使用

xxx-?(hhh|-\w{3}-.*).*
然后呢。 Example here.

答案 3 :(得分:0)

让我们不要过分思考:

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"