Як я можу витягнути підрядку з рядка в 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"