从 Ruby 变量中删除空格的简单方法?

3

我正在使用Ruby on Rails 4.2.7,我想去掉一个变量中的空格,但是我不知道它是哪种类型的空格。是否有一种无误的strip方法?当我从某个变量中复制和粘贴时,我无法去除空格,但是当我手动输入时,一切正常。请看下面的控制台:

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

我从另一个来源进行了剪切和粘贴,但空格没有被去除。有没有一种可靠的方法可以为我的变量提供去除空格的处理?


你能提供该源代码或其中的一个示例吗? - Sagar Pandya
1
我尝试复制您的错误,但未能复现,因此可能是输入中包含的空格字符未被复制到您的问题中。您能否将test.bytestest.encoding的结果添加到问题中? - Neil Slater
1
"Space"是一种不间断的空格,也称为"\xa021" - the Tin Man
3
询问关于不可见字符时,重要的是提供一种方便人们复制问题的方法。我们可以编辑问题并从中选择文本,但这是部落知识,许多人不会考虑到这一点。相反,提供一个字符串赋值,将重新创建实际的字符串。这都是创建符合"[mcve]"的问题的一部分。 - the Tin Man
3个回答

7

你可能有一个非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" 

2
您不能使用正常的 \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"

或者通过使用可以显示实际序号值的编辑器(如Vim)查看它。

-2

尝试使用正则表达式

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

中间的奇怪部分 (\S(.\S)?)? 捕获了 \A\s(开头的空格)和 \s*\z(结尾的空格)之间的文本。


2
但是\s仍然只能识别ASCII字符,而String#strip将处理任何ASCII空格。 - mu is too short
1
\s\S不能捕获Unicode字符。它们在http://ruby-doc.org/core-2.3.1/Regexp.html#class-Regexp-label-Character+Classes中有定义。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接