Как найти строки не ascii в массиве строк в Rails 2.0 / ruby ​​1.8.6? - PullRequest
4 голосов
/ 02 июня 2009

У меня есть массив, полный пользовательских логинов, которые были загружены из базы данных. Какой самый простой и эффективный способ сохранить только те логины, которые не являются символами ascii?

logins = Users.find(:all).map{|user|user.login}
logins_with_non_ascii_characters = logins.select{ |login| ...??? }

Спасибо

Редактировать : если у вас есть решение SQL (я использую MySQL, но универсальное решение было бы лучше), чтобы отфильтровывать логины непосредственно в первой строке с помощью условия: хорошо с этим тоже. На самом деле, это было бы гораздо эффективнее:

logins = Users.find(:all, :conditions => "...???").map{|user|user.login}

Ответы [ 3 ]

9 голосов
/ 02 июня 2009

Вы можете использовать встроенные в Ruby классы символов регулярных выражений для этого

[: print:] содержит все печатные символы ASCII. Он не содержит символов ASCII, таких как гудки или, что важно, многобайтовые символы.

Исходя из предположения, что у ваших пользователей вряд ли будет ASCII BEEP в качестве символа в их пароле,

#reject if has non-ascii character
valid_users = users.reject! {|user| user.login =~ /[^[:print:]]/} 

должен сделать это за вас.

2 голосов
/ 02 июня 2009

Все, что я нашел до сих пор, это:

def is_ascii(str)
    str.each_byte {|c| return false if c>=128}
    true
end

logins = Users.find(:all).map{|user|user.login}
logins_with_non_ascii_characters = logins.select{ |login| not is_ascii(login) }

Это немного разочаровывает и, конечно, неэффективно. У кого-нибудь есть идея получше?

1 голос
/ 12 декабря 2013

Вы можете выбрать только логин из пользователей:

non_ascii = /[\u0080-\uffff]/
logins = Users.select(:login).find_all {|login| login =~ non_ascii }

Или вы можете использовать /\p{ASCII}/ в Ruby 2.0

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