Ruby空格字符不等于空格字符

时间:2018-08-30 02:41:56

标签: ruby string

在以下语句中,一个空格来自用户的输入(我从远程Rails控制台(ActiveRecord字段)复制了用户的字符,并粘贴了它),另一个空格来自我的键盘。语句返回false

$sql = "SELECT AwayTeam, SUM(FTHG < FTAG) AS Wins, 
               SUM(FTHG = FTAG) AS Draws, SUM(FTHG > FTAG) AS Losses
        FROM (SELECT * FROM fixtures WHERE AwayTeam = '$ATeam' ORDER BY id DESC LIMIT 10)
        GROUP BY AwayTeam";

关于为什么/如何发生的任何想法?

2 个答案:

答案 0 :(得分:5)

要验证用户输入的空白,不应使用==和/或include?助手。一个人应该使用现代的正则表达式,即匹配对象空格

仅供参考:UTF-8规范中有十多个空格字符,包括但不限于:

spaces = {
  space_medium_mathematical_space: " ",
  spaces_em_quad: " ",
  spaces_em_space: " ",
  spaces_en_quad: " ",
  spaces_en_space: " ",
  spaces_figure_space: " ",
  spaces_four_per_em_space: " ",
  spaces_hair_space: " ",
  spaces_punctuation_space: " ",
  spaces_six_per_em_space: " ",
  spaces_thin_space: " ",
  spaces_three_per_em_space: " "
}

要匹配它们,可以使用\p{Space}匹配器。

spaces.values.map { |s| s == ' ' }
#⇒ [false, false, false, false, false, false,
#   false, false, false, false, false, false]

但是:

spaces.values.map(&/\A\p{Space}*\z/.method(:match?))
#⇒ [true, true, true, true, true, true,
#   true, true, true, true, true, true]

答案 1 :(得分:1)

我相信您可以利用String#unicode_normalize。它具有几种规范化形式,已在unicode.org中进行了说明。似乎:nfkc:nfkd符合此目的。

s = "foo bar" # <-- includes a non breaking space
space = " "   # <-- regular space

s.include?(space)                          # => false
s.unicode_normalize(:nfkc).include?(space) # => true