Извлечь подстроку из строки в Ruby с помощью регулярного выражения - PullRequest
110 голосов
/ 06 ноября 2010

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

Пример:

String1 = "<name> <substring>"

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

Ответы [ 5 ]

290 голосов
/ 07 ноября 2010
"<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

116 голосов
/ 06 ноября 2010
String1.scan(/<([^>]*)>/).last.first

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

21 голосов
/ 06 ноября 2010

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

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

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

или без разрешенных пробелов:

str.match(/<([^>]+)>\Z/)[1]
9 голосов
/ 30 августа 2013

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

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

String1.scan(/<(\S+)>/).last
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...