我正在使用Ruby on Rails 4.2.7,我想去掉一个变量中的空格,但是我不知道它是哪种类型的空格。是否有一种无误的strip方法?当我从某个变量中复制和粘贴时,我无法去除空格,但是当我手动输入时,一切正常。请看下面的控制台:
2.3.0 :004 > test = " 21"
=> " 21"
2.3.0 :005 > test.strip
=> " 21"
我从另一个来源进行了剪切和粘贴,但空格没有被去除。有没有一种可靠的方法可以为我的变量提供去除空格的处理?
我正在使用Ruby on Rails 4.2.7,我想去掉一个变量中的空格,但是我不知道它是哪种类型的空格。是否有一种无误的strip方法?当我从某个变量中复制和粘贴时,我无法去除空格,但是当我手动输入时,一切正常。请看下面的控制台:
2.3.0 :004 > test = " 21"
=> " 21"
2.3.0 :005 > test.strip
=> " 21"
我从另一个来源进行了剪切和粘贴,但空格没有被去除。有没有一种可靠的方法可以为我的变量提供去除空格的处理?
你可能有一个非ASCII的Unicode空格字符,最有可能是0x00A0:
> test = "\u00A021"
=> " 21"
> test.strip
=> " 21"
String#strip
目前只支持ASCII空白字符:
strip → new_str
[...]空白字符的定义如下:null、水平制表符、换行符、垂直制表符、换页符、回车符和空格。
你可以使用String#gsub
和空格
字符属性手动完成它:
> test = "\u00A0 21 \t\u00a0"
=> " 21 \t "
> test.gsub(/\A\p{Space}+|\p{Space}+\z/, '')
=> "21"
\s
或 \S
处理UTF-8或Unicode中的扩展字符。相反,我会这样做:" 21".gsub(/[[:space:]]+/, '') # => "21"
" 21".gsub(/[[:blank:]]+/, '')
ord.to_s(16)
来确定字符是什么:>> test = " 21"
" 21"
>> test.ord
160
>> test.ord.to_s(16)
"a0"
>> test[0].ord.to_s(16)
"a0"
尝试使用正则表达式
test.gsub(/\A\s*(\S(.*\S)?)?\s*\z/,'\1')
中间的奇怪部分 (\S(.\S)?)? 捕获了 \A\s(开头的空格)和 \s*\z(结尾的空格)之间的文本。
\s
仍然只能识别ASCII字符,而String#strip
将处理任何ASCII空格。 - mu is too short\s
和\S
不能捕获Unicode字符。它们在http://ruby-doc.org/core-2.3.1/Regexp.html#class-Regexp-label-Character+Classes中有定义。 - the Tin Man
test.bytes
和test.encoding
的结果添加到问题中? - Neil Slater"\xa021"
。 - the Tin Man