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


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

пример:

String1 = "<name> <substring>"

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

5 96

5 ответов:

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

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

"<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

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

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

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

или без пробелов:

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

вот немного более гибкий подход с использованием 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"

более простое сканирование будет:

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