Ruby: проверка строки ruby на подстроку не удалась (подстрока не распознана) - PullRequest
0 голосов
/ 31 января 2020

Используя Ruby, я пытаюсь отсеять спам-сообщения вручную, так почему именно приведенный ниже тест возвращает false, когда должен возвращаться true? Проверенная строка является оригинальной , поэтому вы можете буквально скопировать / вставить все это в консоль ruby, чтобы проверить этот пример:

irb(main):053:0> "Веautiful women fоr sеx in yоur town АU: https://links.wtf/qLFs".include? "sex"
=> false

Подсказка: если вы замените Слово "секс" внутри всей строки, набрав его в себе, тест вернет true, как и ожидалось. Так что, так или иначе, две «половые» строки не одинаковы, но на каком уровне? Как проверить это правильно?

РЕДАКТИРОВАТЬ :

Я сузил все до этого (скопируйте / вставьте, чтобы проверить это!):

irb(main):073:0> "е" == "e"
=> false

1 Ответ

0 голосов
/ 31 января 2020
Метод

JavaScript charCodeAt говорит мне, что два символа - это разные значения Юникода. Ruby метод .ord говорит мне то же самое. Вы можете проверить эти значения Unicode более буквально в Ruby, но я бы порекомендовал найти способ нормализации данных вместо добавления бесконечных условий для необычных символов. Похоже, что это 0x0435 1077 CYRILLIC SMALL LETTER IE е в соответствии с таблицей поиска Unicode, которую я нашел в Интернете.

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

#!/usr/bin/env ruby

CYRILLIC_UNICODE_DECIMALS = *(1024..1273).freeze

for arg in ARGV
  # next unless arg.is_a?(String)

  arg.split('').each do |char|
    p char if CYRILLIC_UNICODE_DECIMALS.include?(char.ord)
  end
end

Для справки, это методы .ord и .charCodeAt, которые я использовал против вашего примера. Я начал с JavaScript, потому что это простой тест в консоли браузера.

2.6.3 :005 > 'е'.ord
 => 1077
2.6.3 :006 > 'e'.ord
 => 101
'"е" == "e"'.charCodeAt(1)
1077
'"e" == "e"'.charCodeAt(1)
101
...