如何有条件地更换前缀或前缀/后缀GSUB
问题描述:
我有2案件字符串我需要GSUB:如何有条件地更换前缀或前缀/后缀GSUB
前缀始终是相同的:前xxx
中间可能是hhh
或yyy
'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条语句,这将是不错...
答
可以依靠捕获组:而不是用另一个替换匹配的字符串,您使用捕获组,由括号分隔的一个,作为结果您正在寻找。
"xxx-hhh-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> 'hhh'
"xxx-yyy-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> '-yyy-mmm'
'\1'
这里指的是第一个捕获组内的模式匹配:(。*)或者(HHH)或
答
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条语句完成这两种情况下,它会对人好点。
为什么?
答
你应该能够做到这一点使用
xxx(-hhh-|-\w{3}-.*).*
,并与第一个捕获组替换即
data.gsub(/xxx(-hhh-|-\w{3}-.*).*/, "\\1")
在有数据的字符串。
问候
编辑:注意到你不想连字符hhh
。使用
xxx-?(hhh|-\w{3}-.*).*
代替然后。Example here.
答
让我们不要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"
[''XXX-YYY-111'.match /xxx(.*)- 111 /'](https://repl.it/BXN2/1) – potashin
抱歉,不得不解决我的问题......但。匹配很好,不知道,将研究 – Bodao
['^ xxx(?:( - (?!HHH)[^ - ] * - [^ - ] *)| - (HHH) - [^ - ] *)$'](https://regex101.com/r/hA9qT1/1)。 [Ruby演示](http://ideone.com/Dbea3e)。 –