"problematic".sub(/[aeiou](?=[^aeiou]*\z)/i, '')
#=> "problematc"
"HELLO".sub(/[aeiou](?=[^aeiou]*\z)/i, '')
#=> "HELL"
"sly".sub(/[aeiou](?=[^aeiou]*\z)/i, '')
#=> "sly"
См. String # sub .
Регулярное выражение гласит: «соответствует любой гласной ([aeiou]
), за которой следует ноль или более (*
) символов, кромегласные ([^aeiou]
), за которыми следует конец строки (\z
), при этом совпадения не зависят от регистра (/i
) ".
[aeiou]
- это класс символов означает, что должно совпадать только одно из его содержимого.
(?=[^aeiou]*\z)
является положительным прогнозом (обозначено ?=
).
[^aeiou]
являетсятакже класс символов, но карат (^
) в первой позиции означает, что должен совпадать ровно один символ, отличный от символов, следующих за ^
. Здесь это означает согласный.
Другой способ - использовать метод String # rindex :
str = "problematic"
idx = str.rindex(/[aeiou]/i)
idx ? (str[0,idx]+str[idx+1..-1]) : str
#=> "problematc"
str = "A"
idx = str.rindex(/[aeiou]/i)
idx ? (str[0,idx]+str[idx+1..-1]) : str
#=> ""