2012-02-12 3 views
6

Если бы я хотел, чтобы удалить такие вещи, как:.!. , ' "^ - # из массива строк, как бы я идти об этом, сохраняя при этом все буквенные и цифровые символыУдалить все не алфавитные, не числовые символы из строки?

Разрешенные алфавитные символы должны также включать в себя буквы .. с диакритическими знаками, в том числе или с

+1

http://stackoverflow.com/questions/737475/how-i-can-delete-special-characters это ответит на 50% вашего вопроса. – Devjosh

+2

Обычно мы говорим о строке с символами и массивом, имеющим разные данные, например объекты, числа или строки. У вас действительно есть массив (возможно, массив строк?) Или просто строка? – Phrogz

+0

-1. Не столько для того, чтобы не пытаться это исправить, а потому, что вопрос бессмыслен по причине, заданной Фрогзом. –

ответ

17

вы должны использовать регулярное выражение с правильным свойством символа В этом случае, вы можете инвертировать Alnum класс (алфавитный и цифровой символ):

"◊¡ Marc-André !◊".gsub(/\p{^Alnum}/, '') # => "MarcAndré" 

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

"◊¡ Marc-André !◊".gsub(/[^\p{Alnum}\p{Punct}]/, '') # => "¡MarcAndré!" 

Для всех свойств символов, вы можете обратиться к doc.

+0

Обратите внимание, что вы отвечаете, как gsub на строку, но в названии и описании используется слово «массив». – Phrogz

+1

@Phrogz: Действительно. Надеюсь, OP знает, как сделать «карту». –

+1

+1 для отображения правильных наборов Unicode. – Phrogz

1

Вы можете рассмотреть регулярное выражение.

http://www.regular-expressions.info/ruby.html

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

Регулярное выражение можно использовать может пойти что-то вроде этого:

[^.!,^-#] 

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

3

Ниже будет работать на array:

z = ['asfdå', 'b12398!', 'c98347'] 
z.each { |s| s.gsub! /[^[:alnum:]]/, '' } 
puts z.inspect 

Я одолжил Джереми предложил regex.

+0

Спасибо, Фрогц, я полностью пропустил это. :) – kikuchiyo

1

Если у вас действительно есть массив (как вы заявляете), и это массив строк (я предполагаю), например.

foo = [ "hello", "42 cats!", "yöwza" ] 

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

Если прежний (вы хотите «чистый» каждая строка массива) вы можете сделать одно из следующих действий:

foo.each{ |s| s.gsub! /\p{^Alnum}/, '' }  # Change every string in place… 
bar = foo.map{ |s| s.gsub /\p{^Alnum}/, '' } # …or make an array of new strings 
#=> [ "hello", "42cats", "yöwza" ] 

Если последний (вы хотите, чтобы выбрать подмножество строк, где каждый матчей ваши критерии холдингового только буквенно-цифровой), вы можете использовать один из них:

# Select only those strings that contain ONLY alphanumerics 
bar = foo.select{ |s| s =~ /\A\p{Alnum}+\z/ } 
#=> [ "hello", "yöwza" ] 

# Shorthand method for the same thing 
bar = foo.grep /\A\p{Alnum}+\z/  
#=> [ "hello", "yöwza" ] 

в Ruby, регулярные выражения вида /\A………\z/ требуют всей строки, чтобы соответствовать, а \A якорю регулярного выражения в начало строки а nd \z анкеры до конца.

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