Як я можу витягнути підрядку з рядка в Ruby?
Приклад:
String1 = "<name> <substring>"
Я хочу витягнути substringз нього String1(тобто все в межах останнього появи <та >).
Як я можу витягнути підрядку з рядка в Ruby?
Приклад:
String1 = "<name> <substring>"
Я хочу витягнути substringз нього String1(тобто все в межах останнього появи <та >).
Відповіді:
String1.scan(/<([^>]*)>/).last.first
scanстворює масив, який для кожного <item>з 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"