JS, разделяющий строку, содержащую числа, возвращает массив с пустым элементом

Например, учитывая строку foo123 и разбивая ее так, чтобы целые числа и символы были разделены с помощью split(/(\d+)/g), возвращается массив с пустым элементом в конце

let str  = 'foo123'
let splits = str.split(/(\d+)/g)
console.info(splits)

Выход:

[ 'foo', '123', '']

пока я ожидаю [ 'foo', '123'], почему это происходит и как я могу разделить символы из целых чисел без пустого элемента в конце? Также, когда входная строка, например, метод разделения foo123bar не возвращает пустой элемент.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
92
4

Ответы 4

Попробуй это:

let str  = 'foo123'
let splits = str.split(/(\d+)/g).filter(x => x! = "")
console.info(splits)

Это происходит из-за того, что метод split разделяет ваш массив (в данном случае строку) налево и направо... чтобы избежать этого простого фильтра для удаления пробелов.

Это связано с тем, что для определения среза: .... Если исходный текст начинается или заканчивается разделителем, функция возвращает массив, первым или последним элементом которого будет пустой текст соответственно. ...

Попробуй это

let str  = 'foo123'
let splits = str.split(/(\d+)/g).filter(Boolean)
console.info(splits)

Он добавляет пустой элемент, потому что вы используете последовательность цифр в качестве разделителя. Так что правая сторона в вашем случае будет пустой, потому что после цифр нет символа.

Чем это отличается от ответа Даниэля?

Felix Kling 14.03.2019 19:59

не большая разница, но внутри фильтра можно просто написать Boolean instated.

Vijay Vamja 14.03.2019 20:09

why does this happen

Вы используете последовательность цифр как разделитель. Разделитель отделяет левую сторону от правой. В вашем примере разделителем является в конце строки, поэтому правая сторона пуста (-> пустая строка).

Why split method doesn't return empty element when the input string is e.g foo123bar ?

Потому что строка не конец с вашим разделителем.

Это ничем не отличается от использования любого другого значения в качестве разделителя.

console.info('foo,'.split(','));
console.info('foo,bar'.split(','));

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


Если ввод всегда имеет одну и ту же структуру, то есть буквы, за которыми следуют цифры, я бы просто нашел индекс первой цифры, а затем соответствующим образом нарезал строку:

function split(str) {
  const match  = str.match(/\d/);
  if (match) {
    return [str.slice(0, match.index), str.slice(match.index)];
  }
  return [str];
}

console.info(split('foo123'));

за подробный ответ +1. на примечании: - Почему бы не нарезать str.match(/[A-Z]+|\d+/gi) ?

Code Maniac 14.03.2019 20:02

Это просто другой способ ¯\_(ツ)_/¯. Любое регулярное выражение действительно зависит от диапазона возможных входных данных. Мы знаем только об одном, поэтому я попытался сделать как можно меньше предположений (но допустим, ожидание, что ввод всегда будет нецифровым, за которым следуют цифры, является большим предположением).

Felix Kling 14.03.2019 20:05

один вопрос, почему 'foo123'.split(/\d+/) и 'foo123'.split(/(\d+/)) дают разные результаты?

Code Maniac 14.03.2019 20:14

@CodeManiac Я как бы упомянул об этом в своем ответе: если разделитель содержит группу захвата, содержимое группы захвата включается в вывод. Следовательно, если нет группы захвата, никакая часть разделителя не включается.

Felix Kling 14.03.2019 20:18

Другие вопросы по теме