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:]]等相同...)
当我处理大量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)