我有这个大型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。
答案 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"]