【问题标题】:Can't split/strip by space in a string in Ruby because it's an NBSP character无法在 Ruby 中的字符串中按空格拆分/剥离,因为它是 NBSP 字符
【发布时间】:2011-12-28 08:42:03
【问题描述】:

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

所以我执行以下操作将分割后的数据保存到 a & 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。

【问题讨论】:

  • 想象一下,您在阅读这个问题之前对自己在做什么没有任何想法。你觉得你能理解题主的意思吗?
  • 抱歉,我试图澄清一下
  • 也许它实际上是一个制表符?试试 a.split(/\s+/) 看看是否有帮助。
  • 是的,试过了,但也没用

标签: ruby string text ruby-1.9


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    当我处理大量 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"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2011-11-16
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多