В настоящее время я пытаюсь преобразовать строку в несколько переменных. Пример строки:
ryan_string = "RyanOnRails: This is a test"
Я сопоставил его с этим регулярным выражением с 3 группами:
ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)
Теперь, чтобы получить доступ к каждой группе, мне нужно сделать что-то вроде этого:
ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test
Это кажется довольно смешным, и мне кажется, что я делаю что-то не так. Я ожидал, что смогу сделать что-то вроде этого:
g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)
Это возможно? Или есть способ лучше, чем я?
источник
one, two, three = string.match(/(^.*)(:)(.*)/i).captures
на:one, two, three = string.match(/(^.*)(:)(.*)/i).try(:captures)
&.
оператор, чтобы вернуть его в линию и даже использовать его дважды, когда есть только одна группа захвата. Например,string.match(regex)&.captures&.first
Вы можете использовать MatchВместо этого или = ~, что даст вам одно совпадение, и вы можете получить доступ к данным совпадения таким же образом или просто использовать специальные переменные совпадения $ 1, $ 2, $ 3
Что-то вроде:
источник
Вы можете назвать свои захваченные матчи
Это не сработает, если вы измените порядок строки и регулярного выражения.
источник
Вы должны решить, хорошая ли это идея, но регулярное выражение ruby может (автоматически) определять локальные переменные за вас!
Я еще не уверен, хороша ли эта функция или просто сумасшедшая, но ваше регулярное выражение может определять локальные переменные.
(Взгляните на http://ruby-doc.org/core-2.1.1/Regexp.html , найдите "локальную переменную").
Примечание. Как указано в комментарии, я вижу, что на этот вопрос есть аналогичный и более ранний ответ от @toonsend ( https://stackoverflow.com/a/21412455 ). Я не думаю, что я «воровал», но если вы хотите быть честными с похвалами и уважать первый ответ, не стесняйтесь :) Я надеюсь, что ни одно животное не пострадало.
источник
scan()
найдет все неперекрывающиеся совпадения регулярного выражения в вашей строке, поэтому вместо того, чтобы возвращать массив ваших групп, как вы, кажется, ожидаете, он возвращает массив массивов.Вам, вероятно, лучше использовать
match()
, а затем получить массив захватов, используяMatchData#captures
:Однако вы также можете сделать это,
scan()
если хотите:источник