str = "string 1 | string 2 | string 3"
r = /
.* # match any number of any character (greedily)
\| # match a pipe
[ ] # match a space
\K # forget everything matched so far
.+ # match remainder of string
/x # free-spacing regex definition mode
str[r]
#=> "string 3"
Регулярное выражение обычно записывается следующим образом:
r = /.*\| \K.+/
При записи в свободном интервале пробел, следующий за каналом, должен быть заключен в класс символов, иначе Ruby преобразует его в пустую строку.
Ключевым моментом здесь является то, что .*
в начале является жадным по умолчанию, поэтому он будет сожирать символы, пока не дойдет до последнего канала, за которым следует пробел.
Вот несколько других способов:
str[2 + str.rindex('| ')..-1]
#=> "string 3"
str.reverse[/.*?(?= \|)/].reverse
#=> "string 3"