2015-11-05 327 views
0

我有2案件字符串我需要GSUB:如何有条件地更换前缀或前缀/后缀GSUB

前缀始终是相同的:前xxx 中间可能是hhhyyy

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

我在这两种情况下需要做的是始终删除前缀:xxx因此,此工作正常:

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

结果:

'-yyy-aaa' 

但有时我需要检查身体是否hhh,如果属实,那么去掉前缀和后缀(图案是后缀会随机数字)

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

所以我找当字符串是xxx-hhh-111的结果是:

'hhh' 

最简单的方法是将2条语句,一个是第一始终在卸下XXX我使用上述

这和一个只是检查是否存在hhh,如果这样返回hhh例如:

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

,但如果我能做到的机器人^ h例1条语句,这将是不错...

+1

[''XXX-YYY-111'.match /xxx(.*)- 111 /'](https://repl.it/BXN2/1) – potashin

+0

抱歉,不得不解决我的问题......但。匹配很好,不知道,将研究 – Bodao

+0

['^ xxx(?:( - (?!HHH)[^ - ] * - [^ - ] *)| - (HHH) - [^ - ] *)$'](https://regex101.com/r/hA9qT1/1)。 [Ruby演示](http://ideone.com/Dbea3e)。 –

回答

1

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

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

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

0

1)

data = [ 
    'xxx-hhh-111', 
    'xxx-yyy-aaa' 
] 


data.each do |str| 
    p str.sub(/[^-]+(-([^-]+).*)/) {$2=='hhh' ? $2:$1} 
end 

--output:-- 
"hhh" 
"-yyy-aaa" 

2)

data = [ 
    'xxx-hhh-111', 
    'xxx-yyy-aaa' 
] 

data.each do |str| 
    p str.include?('h') ? 'hhh' : str[3..-1] 
end 

--output:-- 
"hhh" 
"-yyy-aaa" 

,但如果我可以用1条语句完成这两种情况下,它会对人好点。

为什么?

0

你应该能够做到这一点使用

xxx(-hhh-|-\w{3}-.*).* 

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

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

在有数据的字符串。

问候

Example here

编辑:注意到你不想连字符hhh。使用

xxx-?(hhh|-\w{3}-.*).* 

代替然后。Example here.

0

让我们不要overthink这样的:

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"