Как я могу извлечь подстроку из строки в Ruby?
Пример:
String1 = "<name> <substring>"
Я хочу извлечь substringиз String1(т. Е. Все, что было до последнего появления <и >).
Как я могу извлечь подстроку из строки в Ruby?
Пример:
String1 = "<name> <substring>"
Я хочу извлечь substringиз String1(т. Е. Все, что было до последнего появления <и >).
Ответы:
String1.scan(/<([^>]*)>/).last.first
scanсоздает массив, который для каждого <item>in String1содержит текст между <и >в одноэлементном массиве (потому что при использовании с регулярным выражением, содержащим группы захвата, сканирование создает массив, содержащий захваты для каждого совпадения). lastдает вам последний из этих массивов, а firstзатем дает вам строку в нем.
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
Не нужно использовать scan, если нужен только один результат.
Нет необходимости использовать Python match, когда у нас есть Ruby String[regexp,#].
См. Http://ruby-doc.org/core/String.html#method-i-5B-5D.
Примечание: str[regexp, capture] → new_str or nil
if we need only one resultна свое решение. И match()[]медленнее, потому что это два метода вместо одного.
string[regex]что в этом сценарии он может быть таким же читаемым, поэтому я лично использовал его.
Вы можете легко использовать регулярное выражение для этого ...
Допускаем пробелы вокруг слова (но не оставляем их):
str.match(/< ?([^>]+) ?>\Z/)[1]
Или без разрешенных пробелов:
str.match(/<([^>]+)>\Z/)[1]
<>действительно должно быть последним в строке. Если, например, строка foo <bar> bazразрешена (и должна давать результат bar), это не сработает.
Вот несколько более гибкий подход с использованием этого 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"