Удалить все, кроме некоторых специальных символов - PullRequest
0 голосов
/ 06 августа 2010

Я пытаюсь найти регулярное выражение для удаления всех специальных символов, кроме некоторых. Например, у меня есть строка:

str = "subscripción gustaría♥"

Я хочу, чтобы вывод был "subscripción gustaría".

Я пытался сделать так: сопоставьте все, что не является символом ascii (00-7F) и не является специальным символом, который я хочу, и замените его пустым.

str.gsub(/(=?[^\x00-\x7F])(=?^\xC3\xB3)(=?^\xC3\xA1)/,'') 

Это не работает. Последний специальный символ не удаляется.

Может кто-нибудь помочь? (Это рубин 1.8)

Обновление: я пытаюсь сделать вопрос немного более ясным. Строка в кодировке utf-8. И я пытаюсь внести в белый список символы ascii плюс - и í и занести в черный список все остальное.

Ответы [ 5 ]

2 голосов
/ 06 августа 2010

Oniguruma имеет поддержку всех персонажей, которые вам нужны, без необходимости иметь дело с кодовыми точками. Вы можете просто добавить символы Юникода в белый список символов, за которым следует опция 'u'.

ruby-1.8.7-p248 > str = "subscripción gustaría♥"
 => "subscripci\303\263n gustar\303\255a\342\231\245" 
ruby-1.8.7-p248 > puts str.gsub(/[^a-zA-Z\sáéíóúÁÉÍÓÚ]/u,'')
subscripción gustaría
 => nil 
1 голос
/ 06 августа 2010

Вопрос немного расплывчатый. Там нет ни слова о кодировании строки. Кроме того, вы хотите белый список символов или черный список? Какие? Но вы понимаете, решаете, что вы хотите, а затем используете подходящие диапазоны, как уже предложили коллеги. Некоторые примеры: если str = "subscripción gustaría ♥" - это utf-8 тогда вы можете занести в черный список все символы выше указанного диапазона (кроме пробелов):

     str.gsub(/[^\x{0021}-\x{017E}\s]/,'')

если строка находится в кодовой странице ISO-8859-1, вы можете попытаться сопоставить все причудливые символы, такие как «сердце» в начале диапазона ASCII:

    str.gsub(/[\x01-\x1F]/,'')

Проблема здесь с регулярным выражением, не имеет ничего общего с Ruby. Возможно, вам придется больше экспериментировать.

1 голос
/ 06 августа 2010
str.split('').find_all {|c| (0x00..0x7f).include? c.ord }.join('')
0 голосов
/ 11 августа 2010

В итоге я сделал это: str.gsub (/ [^ \ x00- \ x7FÁáÉéáíÑñÓóÚúÜü] /, '').Он не работает на моем Mac, но работает на Linux.

0 голосов
/ 06 августа 2010

Не совсем ясно, какие символы вы хотите сохранить, а какие хотите удалить. Символ строки примера - это какой-то символ Unicode, который в моем браузере отображается как символ сердца. Но, похоже, вы имеете дело с 8-битными символами ASCII (поскольку вы используете ruby ​​1.8 и ваши регулярные выражения указывают именно на это).

Тем не менее, вы должны быть в состоянии сделать это одним из двух способов; либо укажите символы, которые вы хотите сохранить, либо, альтернативно, укажите символы, которые вы хотите удалить. Например, следующее указывает, что все символы 0x00-0x7F и 0xC0-0xF6 должны быть сохранены (удалить все, что не входит в эту группу):

puts str.gsub(/[^\x00-\x7F\xC0-\xF6]/,'') 

Этот следующий пример указывает, что символы 0xA1 и 0xC3 должны быть удалены.

puts str.gsub(/[\xA1\xC3]/,'') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...