Извлеките подстроку из строки в 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