Что такое "рубиновый путь" для синтаксического анализа строки для одного ключа/значения?

Я пытаюсь проанализировать многострочную строку и получить оставшуюся часть строки после шаблона.

текст

hello john
your username is: jj
thanks for signing up

Я хочу извлечь jj, aka all после "вашего имени пользователя:"

Один из способов:

text = "hello john\nyour username is: jj\nthanks for signing up\n"
match = text[/your username is: (.*)/]
value = $1

Но это напоминает мне perl... и не "читает" так естественно, как мне сказали, что Ruby должен.

Есть ли более чистый способ? AKA "Рубиновый" способ?

Спасибо

Ответ 1

Ваш код очень похож на Ruby. Если вы не хотите использовать глобальный $1, вы можете использовать версию 2 arg String#[]:

match = text[/your username is: (.*)/, 1]

Ответ 2

Команда split - разумно полезная. Он делит строку на массив подстрок, разделяя все, что вы проходите. Если вы не дадите никаких аргументов, он разбивается на пробелы. Поэтому, если вы знаете, что слово, которое вы ищете, является пятым "словом" (разделение на оба пространства и обратный символ), вы можете сделать это:

text = "hello john\nyour имя пользователя: jj\nthanks для регистрации \n"
матч = text.split [5]

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

срединный = text.split( "\ п" ) [1]
match = middleline.split( "username is:" ).last

Или, возможно, это более сложный способ:

match = text [/username is: (. *)/, 1]

Ответ 3

Не уверен, что это больше Ruby'ish, но другой вариант:

>> text = "hello john\nyour username is: jj\nthanks for signing up\n"
>> text.match(/your username is: (.*)/)[1]
=> "jj"

Ответ 4

Здесь также Regexp#match, который возвращает объект MatchData, который имеет всю необходимую информацию.

irb> match = /your username is: (.*)/.match "hello john\nyour username is: jj\nthanks for signing up\n"
#=> #<MatchData:0x557f94>
irb> match.pre_match
#=> "hello john\n"
irb> match.post_match
#=> "\nthanks for signing up\n"
irb> match[0]
#=> "your username is: jj"
irb> match[1]
#=> "jj"