从 Ruby 变量中去除空格的万无一失的方法?

Foolproof way to strip whitespace from a Ruby variable?

我在 Rails 4.2.7 上使用 Ruby。我无法从变量中剥离白色 space。分不清是什么白space。有万无一失的剥离方法吗?当我从某个变量剪切和粘贴时,我无法去除白色的 space 但是,当我输入 space 时,一切正常。在下面查看我的控制台:

2.3.0 :004 >   test = " 21"
 => " 21" 
2.3.0 :005 > test.strip
 => " 21" 

我从其他来源剪切和粘贴了,白色 space 没有被剥离。有什么办法可以为我的变量提供某种万无一失的剥离方法吗?

尝试使用正则表达式

test.gsub(/\A\s*(\S(.*\S)?)?\s*\z/,'')

奇怪的(\S(.\S)?)?中间的部分捕获 \A\s <- 开头的空格和 \s*\z <- 结尾的空格

之间的文本

您可能有一个非 ASCII Unicode 空白字符,很可能是 0x00A0:

> test = "\u00A021"
 => " 21" 
> test.strip
 => " 21" 

String#strip 只有(目前)知道 ASCII 空白:

strip → new_str
[...]

Whitespace is defined as any of the following characters: null, horizontal tab, line feed, vertical tab, form feed, carriage return, space.

您可以通过 String#gsub and the Space character property 手动完成:

> 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:]]+/, '')

请参阅正则表达式文档中的“Character Classes”。

你可以通过使用 ord.to_s(16) 来判断一个字符是什么:

>> test = " 21"
" 21"
>> test.ord
160
>> test.ord.to_s(16)
"a0"
>> test[0].ord.to_s(16)
"a0"

或者在可以显示实际序数值的编辑器中查看,例如Vim.