2015-11-05 5 views
0

У меня есть 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 заявления, один первый всегда извлекая ххх, который я использую выше

и один раз проверить, если hhh существует, и если да вернуться hhh Ex:

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

, но если я могу выполнить бот ч случаи с 1 заявление, было бы неплохо ...

+1

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

+0

извините, пришлось исправить свой вопрос ... но .match приятно, не знал о, будет исследовать – Bodao

+0

['^xxx (?: (- (?! HHH) [^ -] * - [^ -] *) | - (HHH) - [^ -] *) $ '] (https://regex101.com/r/hA9qT1/1). [Ruby demo] (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

Edit: Заметили вы не хотите, дефисов 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" 
Смежные вопросы