Как получить все ведущие символы до первого экземпляра числа - PullRequest
0 голосов
/ 06 ноября 2010

У меня есть коды продуктов, которые выглядят так:

abc123
abcd23423

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

abc
abcd

Какой лучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 06 ноября 2010
 "abc123 abcd23423".scan(/(\D*)\d+/)
  => [["abc"], [" abcd"]]

 "abc123 abcd23423".scan(/(\D*)\d+/).join
  => "abc abcd"
0 голосов
/ 20 марта 2011

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

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

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

0 голосов
/ 08 ноября 2010
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 голосов
/ 06 ноября 2010
'abc123 abcd23423'.split(/\d+/).join

или просто

'abc123 abcd23423'.gsub(/\d+/,'')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...