Метод string.split в ruby ​​ведет себя смешно - PullRequest
2 голосов
/ 19 апреля 2010

txt = "1aaa5"

Тогда

txt.split("a") производит [1, "", "", 5] в рубине 1.9. Кто-нибудь может объяснить, почему? В частности, почему бы и нет [1, 5]? Спасибо.

Ответы [ 6 ]

10 голосов
/ 19 апреля 2010

Потому что его делится на каждый экземпляр "a"

  1. 1aaa5 распадается на 1 и aa5
  2. aa5 распадается на "" и a5
  3. a5 разбивается на "" и 5

т., 1, "", "", 5

вместо этого используйте / a + / или "aaa"

irb(main):002:0> txt.split(/a+/)
=> ["1", "5"]
3 голосов
/ 19 апреля 2010

Поскольку ваш разделитель равен a, а Ruby не может догадаться, что вам не нужны пустые записи. Рассмотрите пример, но замените символ a запятой.

txt = "1,,,5"

В моем мире я мог бы рассмотреть 4 столбца с нулевыми значениями для средних двух. Я, конечно, не хотел бы, чтобы он удалял пустые записи, потому что если бы не было 4, я бы не знал, какие из них должны быть нулями.

Поскольку он не может угадать, он возвращает как пустые «поля», так и непустые «поля» в массиве. Используйте решение @ S.Mark, если вам нужно пропустить пустые «поля».

2 голосов
/ 19 апреля 2010

Когда вы вызываете split, вы передаете разделитель, который по своей природе удаляется из строки при разделении.

Взять, к примеру, следующее:

s = ",foo"

Когда вы звоните s.split(","), вы говорите: «Возьмите все с левой стороны от запятой и поместите это в собственную запись массива, затем возьмите все с правой стороны от запятой и вставьте в следующую запись , игнорируя саму запятую ". Функция видит «все слева от запятой» как "", а не как ничего.

Итак, ваша строка соответствует следующей схеме:

1aaa5
1, aa5
1, '', a5
1, '', '', 5

Что объясняет, почему есть две пустые строки, а не просто [1,5]

2 голосов
/ 19 апреля 2010

Поведение, которое вы видите, имеет смысл. Когда вы звоните string.split("a"), вы говорите «используйте« a »как разделитель» и даете мне массив значений между разделителями. Между первым 'a' и вторым 'a' в txt значение является пустой строкой; то же самое касается значения между вторым и третьим «а». Вот почему вы видите [1, "", "", 5]

Это как если бы txt был 1,,,5, а вы выбрали ',' в качестве разделителя. Если бы кто-то спросил, какие значения в списке, это было бы:

  1. 1
  2. пусто
  3. пусто
  4. 5
0 голосов
/ 19 апреля 2010

Если вы не указали шаблон для разделения, разделите разделение на пробелах. Так что, в дополнение к другим решениям, вы можете сделать

txt = "1aaa5"
txt.gsub('a',' ').split
=>[1, 5]

(если текст не содержит соответствующих пробелов).

0 голосов
/ 19 апреля 2010

Ваш разделитель "а" присутствует 3 раза. Попробуйте вместо этого разделить на «ааа».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...