Например, учитывая строку foo123 и разбивая ее так, чтобы целые числа и символы были разделены с помощью split(/(\d+)/g), возвращается массив с пустым элементом в конце
let str = 'foo123'
let splits = str.split(/(\d+)/g)
console.info(splits)Выход:
[ 'foo', '123', '']
пока я ожидаю [ 'foo', '123'], почему это происходит и как я могу разделить символы из целых чисел без пустого элемента в конце? Также, когда входная строка, например, метод разделения foo123bar не возвращает пустой элемент.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуй это:
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)
Он добавляет пустой элемент, потому что вы используете последовательность цифр в качестве разделителя. Так что правая сторона в вашем случае будет пустой, потому что после цифр нет символа.
не большая разница, но внутри фильтра можно просто написать Boolean instated.
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) ?
Это просто другой способ ¯\_(ツ)_/¯. Любое регулярное выражение действительно зависит от диапазона возможных входных данных. Мы знаем только об одном, поэтому я попытался сделать как можно меньше предположений (но допустим, ожидание, что ввод всегда будет нецифровым, за которым следуют цифры, является большим предположением).
один вопрос, почему 'foo123'.split(/\d+/) и 'foo123'.split(/(\d+/)) дают разные результаты?
@CodeManiac Я как бы упомянул об этом в своем ответе: если разделитель содержит группу захвата, содержимое группы захвата включается в вывод. Следовательно, если нет группы захвата, никакая часть разделителя не включается.
Чем это отличается от ответа Даниэля?