Ответ 1
Ваш код очень похож на Ruby. Если вы не хотите использовать глобальный $1
, вы можете использовать версию 2 arg String#[]
:
match = text[/your username is: (.*)/, 1]
Я пытаюсь проанализировать многострочную строку и получить оставшуюся часть строки после шаблона.
текст
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 "Рубиновый" способ?
Спасибо
Ваш код очень похож на Ruby. Если вы не хотите использовать глобальный $1
, вы можете использовать версию 2 arg String#[]
:
match = text[/your username is: (.*)/, 1]
Команда 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]
Не уверен, что это больше Ruby'ish, но другой вариант:
>> text = "hello john\nyour username is: jj\nthanks for signing up\n"
>> text.match(/your username is: (.*)/)[1]
=> "jj"
Здесь также 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"