Давайте рассмотрим пару ситуаций.
Строка, предшествующая подчеркиванию, должна быть "john"
, а за подчеркиванием следует один или несколько символов
str = "john_1"
У вас есть два варианта.
Используйте положительный взгляд сзади
str[/(?<=john)_.+/]
#=> "_1"
Положительный взгляд сзади требует, чтобы "john" появлялся непосредственно перед подчеркиванием, но это не таквозвращаемая часть совпадения.
Использовать группу захвата:
str[/john(_.+)/, 1]
#=> "_1"
Это регулярное выражение соответствует "john_1"
, но "_.+"
захвачено в захватегруппа 1. Изучив документацию по методу String # [] , вы увидите, что одной из форм метода является str[regexp, capture]
, который возвращает содержимое группы захвата capture
.Здесь capture
равно 1
, что означает первую группу захвата.
Обратите внимание, что строка, следующая за подчеркиванием, может содержать подчеркивания: "john_1_a"[/(?<=john)_.+/] #=> "_1_a"
.
Если подчеркивание может быть в концев приведенных выше регулярных выражениях строки +
заменить на *
(что означает совпадение с нулем или более символов после подчеркивания).
Строка, предшествующая подчеркиванию, может быть чем угодно, и подчеркиваниезатем один или несколько символов
str = "john_mary_tom_julie"
Мы можем рассмотреть два случая.
Возвращаемая строка должна начинаться с первого подчеркивания
В этом случае мы могли бы написать:
str[/_.+/]
#=> "_mary_tom_julie"
Это работает, потому что регулярное выражение по умолчанию жадное , то есть оно начинается с первого найденного подчеркивания.
Возвращаемая строка должна начинаться с последнего подчеркивания
Здесь мы могли бы написать:
str[/_[^_]+\z/]
#=> "_julie"
Это регулярное выражение соответствует подчеркиванию, за которым следует один или несколько символов, которые не являютсянедеформированнойrscores, сопровождаемый якорем конца строки (\z
).
В стороне: метод String#[]
[]
может показаться странным именемдля метода, но, тем не менее, это метод, поэтому его можно вызывать обычным способом:
str.[](/john(_.+)/, 1)
#=> "_1"
Выражение str[/john(_.+)/, 1]
является примером (которых в Ruby много) синтаксический сахар .При написании str[...]
Ruby преобразует его в обычное выражение для методов перед его оценкой.