2014-03-17 3 views
2

Я хотел бы разделить следующую строку:Расщепление Строка до Character

user = "Lisa: yes" 

Так что я могу получить «Лиза»

Прямо сейчас у меня есть:

user[/([a-zA-Z].*?):/] 

, но он возвращает

"Lisa:" 

Как я могу использовать sp зажгла строку, чтобы она вернула каждую букву до двоеточия?

Заранее благодарен!

ответ

4

ли, как показано ниже:

user = "Lisa: yes" 
user[/([a-zA-Z].*?):/,1] # => "Lisa" 

Документация str[regexp, capture]:

Если Regexp подается, согласующий часть строки возвращается. Если захват следует за регулярным выражением, которое может быть индексом или именем группы захвата, следует за регулярным выражением, которое возвращает компонент компонента MatchData.

+0

Обратите внимание, что Arup сделал '*' «ленивый» (он же «не жадный», «неохотный»), добавляя «?». Жадная форма была бы «Лиза: да, Бетти: нет» [/ ([a-zA-Z]. *): /, 1] # => «Лиза: да, Бетти», а не то, что мы хотим. –

0

В качестве альтернативы существует несколько других способов для справки:

# replacing anything after `:` with empty. 
user.gsub(/:.*/, "") 

# splitting the string around : and picking the first one. 
user.split(/\s*:\s*/)[0] 
+0

Разве это не так же, как 'split (':') [0]'? –

+0

@CarySwoveland да. '\ s *' означает любое необязательное пространство вокруг знака ':'. –

7

Вы можете использовать это: user.split(':').first

user = "Lisa: yes" 
=> "Lisa: yes" 
irb(main):006:0> user.split(':').first 
=> "Lisa" 

Метод Раскол превратит вашу строку в массив, этот массив: ['Lisa', 'yes']. Затем вам просто нужно разобрать его первым методом, чтобы получить первый элемент, Lisa. Простой и интуитивно понятный, потому что лично я ненавижу регулярные выражения. Я также, как Arup Ракшит ответ;)

2

еще несколько способов:.

user[0...user.index(':')] 
user.partition(':').first 
user.each_line(':').first.chomp(':') 
require 'stringio' 
StringIO.new(user).gets(':').chomp(':') 
StringIO.new(user).readline(':').chomp(':') 
t = $/; $/ = ':' 
user.each_line.first.chomp 
StringIO.new(user).gets.chomp 
StringIO.new(user).readline.chomp 
$/ = t 
user.chars.take_while {|c| c != ':'}.join 
+1

Ха-ха +1 для опций. (Хотя, как и ответ @ sidney лучший) –

+1

Марк, те, кто опаздывает на ужин, должны пировать на крохах. –

+0

@Jesse, +1 для определения этого. Бонус +5, если вы не читали мои правки. (Читатели: Я ранее «требовал» useringio''.) –

1

В попытке усовершенствовать свой первоначальный регулярному_выражению используя positive lookahead anchor:

user[/[a-zA-Z].*?(?=:)/] 
# => "Lisa" 
Смежные вопросы