Извлеките подстроку из строки в Ruby, используя регулярное выражение

Как извлечь подстроку из строки в Ruby?

Пример:

String1 = "<name> <substring>"

Я хочу извлечь substring из String1 (т.е. все в пределах последнего вхождения < и >).

Ответ 1

String1.scan( /<([^>]*)>/).last.first

scan создает массив, который для каждого <item> в String1 содержит текст между < и > в одноэлементном массиве (потому что, когда он используется с группами, содержащими регулярные выражения, scan создает массив, содержащий захваты для каждого совпадения). last дает вам последний из этих массивов и first, затем выдает в нем строку.

Ответ 2

"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"

Не нужно использовать scan, если нам нужен только один результат.
Не нужно использовать match, если у нас есть String[regexp,#].

Смотрите: http://ruby-doc.org/core/String.html#method-i-5B-5D

Примечание: str[regexp, capture] → new_str or nil

Ответ 3

Вы можете использовать регулярное выражение для этого довольно легко...

Разрешение пробелов вокруг слова (но не их сохранение):

str.match(/< ?([^>]+) ?>\Z/)[1]

Или без допустимых пробелов:

str.match(/<([^>]+)>\Z/)[1]

Ответ 4

Вот несколько более гибкий подход с использованием метода match. При этом вы можете извлечь более одной строки:

s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)

# Use 'captures' to get an array of the captures
matchdata.captures   # ["ants","pants"]

# Or use raw indices
matchdata[0]   # whole regex match: "<ants> <pants>"
matchdata[1]   # first capture: "ants"
matchdata[2]   # second capture: "pants"

Ответ 5

Простейшее сканирование будет:

String1.scan(/<(\S+)>/).last