Невозможно разделить / разделить пробелом строку в Ruby, потому что это символ NBSP - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть этот большой XML-файл. Есть поле, в котором я хочу разбить поле на пробел.

Поэтому я делаю следующее, чтобы сохранить разделенные данные в a & b:

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

Однако некоторые разделены правильно, а некоторые нет (когда все они содержат пробелы). Например, когда я пытаюсь разделить 'Maria Canada', он не разделяется на пробелы.

Я не уверен почему. Если я открою файл в Vim и скопирую этот неправильный текст, я могу правильно разделить их в интерактивной оболочке Ruby:

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

UPDATE

Хорошо, причина в NBSP. Я распечатал те строки, которые не разбиваются в консоли из-за ошибок. Я скопировал текст и вставил в irb. Этот скопированный текст также нельзя разделить на irb, и я не могу удалить это пространство.

>> ' '.strip
=> " "

Затем я запустил ord и обнаружил, что пробел является символом NBSP (его код 160):

>> ' '.ord
=> 160

Таким образом, XML-файл содержит пробел и символы NBSP. Я думаю, что Vim автоматически преобразует NBSP в пробелы, и поэтому, когда я пытался скопировать его из vim, это не NBSP больше.

Теперь мне просто нужно разобраться, как бороться с NBSP.

Ответы [ 2 ]

11 голосов
/ 28 декабря 2011

Вы должны разделить все пробелы, включая не ASCII:

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

Я предполагаю, что вы используете Ruby 1.9+ и что ваш str имеет правильную кодировку (например, utf-8). Как объяснено в справочнике регулярных выражений , \s соответствует только пробелам ASCII, в то время как [[:space:]] будет соответствовать всем пробелам Юникода (то же самое для \d против [[:digit:]] и т. Д.)

5 голосов
/ 28 декабря 2011

Когда я обрабатывал много 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"]
...