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

lul*_*ala 2 ruby string text ruby-1.9

我有这个大型XML文件.有一个字段,我想按空格分割字段.

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

components = a.split(' ')
a = components[0]
b = components[1]
Run Code Online (Sandbox Code Playgroud)

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

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

'Maria (Canada)'.split(' ')
 => ["Maria","(Canada)"]
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

>> ' '.strip
=> " "
Run Code Online (Sandbox Code Playgroud)

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

>> ' '.ord
=> 160
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*une 11

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

a, b = str.split(/[[:space:]]/)
Run Code Online (Sandbox Code Playgroud)

我假设你使用Ruby 1.9+并且你str有正确的编码(例如utf-8).正如正则表达式引用中所解释的那样,\s只匹配ASCII空格,而[[:space:]]匹配所有unicode空格(对于\dvs [[:digit:]]等相同...)


the*_*Man 5

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

而不是试图解析后删除NBSP,有时我会看他们是否出现在原始的XML编码形式,然后做一个全局搜索和替换我解析之前.在那些位置寻找 \xa0类似的东西.

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

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

# encoding: UTF-8

NBSP = "\u00a0"

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

要么

str.gsub(NBSP, ' ').split(' ')
 => ["a", "b", "c", "z"]
Run Code Online (Sandbox Code Playgroud)