无法在Ruby中的字符串中按空格分割/剥离,因为它是NBSP字符

时间:2011-12-28 08:42:04

标签: ruby string text ruby-1.9

我有这个大型XML文件。我想用空格分割一个字段。

所以我执行以下操作将分割后的数据保存到& B:

components = a.split(' ')
a = components[0]
b = components[1]

然而,有些是正确分割的,但有些则不正确(当它们都包含空格时)。例如,当我尝试拆分'Maria Canada'时,它不会按空格分割。

我不确定为什么。如果我在Vim中打开文件并复制那些特定的错误文本,我可以在Ruby交互式shell中正确分割它们:

'Maria (Canada)'.split(' ')
 => ["Maria","(Canada)"]

更新

好的原因是NBSP。我通过引发错误打印出那些没有在控制台中分开的行。我复制了文本并粘贴在irb中。这些复制的文本也不能在irb中拆分,也不能剥离该空间。

>> ' '.strip
=> " "

然后我运行ord并发现该空间是一个NBSP字符(其代码为160):

>> ' '.ord
=> 160

因此xml文件包含空格和NBSP字符。 我认为Vim自动将NBSP转换为空格,这就是为什么当我尝试从vim复制它时它是不再是NBSP了。

现在我只需要弄清楚如何处理NBSP。

2 个答案:

答案 0 :(得分:11)

您应该拆分所有空格,包括非ASCII空格:

a, b = str.split(/[[:space:]]/)

我假设您使用的是Ruby 1.9+并且您的str具有正确的编码(例如utf-8)。正如regex reference中所述,\s仅匹配ASCII空格,而[[:space:]]将匹配所有unicode空格(\d[[:digit:]]相同,等等... )

答案 1 :(得分:5)

当我处理大量XML时,我会遇到类似的问题。

在解析之后,我不会尝试删除NBSP,有时我会看到它们是否以原始XML中的编码形式出现,然后在解析之前进行全局搜索和替换。在这些职位中寻找 \xa0或类似内容。

或者,你可以做其他几件事:

您可以将分割更改为更智能的内容:

# encoding: UTF-8

NBSP = "\u00a0"

str = "a b\tc#{ NBSP }z"
str.split(/(?:\s|#{ NBSP })+/) # => ["a", "b", "c", "z"]

str.gsub(NBSP, ' ').split(' ')
 => ["a", "b", "c", "z"]