2010-11-06 1 views
0

У меня есть коды продуктов, которые выглядят как:Как получить все ведущие символы перед первым экземпляром ряда

abc123 
abcd23423 

Мне нужно, чтобы все ведущие символы перед первым экземпляром ряда, так:

abc 
abcd 

Каков наилучший способ для этого?

+0

являются коды продуктов должны быть на одной и той же линии или отдельные строки? –

+0

@Greg: Исходный код вопроса, отдельные строки. Я выделил простой текст. @Blankman: посмотрите на предварительный просмотр в следующий раз! –

ответ

2
"abc123 abcd23423".scan(/(\D*)\d+/) 
    => [["abc"], [" abcd"]] 

"abc123 abcd23423".scan(/(\D*)\d+/).join 
    => "abc abcd" 
0
'abc123 abcd23423'.split(/\d+/).join 

или просто

'abc123 abcd23423'.gsub(/\d+/,'') 
0
DATA.each do |l| 
    chars = l[/^([[:alpha:]]+)/, 1] # [:alpha:] = [a-zA-Z] 
    puts chars 
end 

__END__ 
abc123 
abcd23423 

# >> abc 
# >> abcd 

Если вы хотите, чтобы захватить альфа в массив сделать что-то вроде этого:

ary = [] 
DATA.each do |l| 
    ary << l[/^([[:alpha:]]+)/, 1] # [:alpha:] = [a-zA-Z] 
end 
ary # => ["abc", "abcd"] 

__END__ 
abc123 
abcd23423 

Я не использовал \D потому что это означает, что все нечисловые (AKA [^0-9]), но это может быть опасно, если вы собираетесь работать в любой другой текст, который не является альфа-символ:

'abc_-$%#123'[/^(\D+)/, 1] # => "abc_-$%#" 

По той же причине \w не всегда безопасны:

'abc_-$%#123'[/^(\w+)/, 1] # => "abc_" 

[[:alpha:]] это символы алфавита [a-zA-Z]

'abc_-$%#123'[/^([a-zA-Z]+)/, 1] # => "abc" 
'abc_-$%#123'[/^([[:alpha:]]+)/, 1] # => "abc" 
+0

У переполнения стека есть ошибка, при которой код в начале вопроса может вызвать проблемы. –

0

Вы можете использовать регулярное выражение, которое определяет начало строки (\A) и пытается захватить как многие нецифровые символы (\D*), насколько это возможно (* жаден по умолчанию):

processed_codes = codes.map { |code| code.scan(/\A(\D*)/)[0] } 

Вы также можете использовать String#match конечно, но имеет менее предсказуемую/интуитивное поведение.

Смежные вопросы