Как разбить строку символом, которому не предшествует символ того же типа?
Скажем, у меня есть строка: "We.need..to...split.asap"
. То, что я хотел бы сделать, это разделить строку на разделитель .
, но я хочу разделить только первым .
и включить в повторяющийся токен любой повторяющийся .
.
Ожидаемый результат:
["We", "need", ".to", "..split", "asap"]
В других языках я знаю, что это возможно с помощью look-behind /(?<!\.)\./
, но Javascript, к сожалению, не поддерживает такую функцию.
Мне любопытно посмотреть ваши ответы на этот вопрос. Может быть, есть умное использование взглядов, которые теперь уклоняются от меня?
Я рассматривал возможность изменения строки, а затем повторное обращение к токенам, но это похоже на слишком много работы за то, что я получаю после... плюс споры: Как вы меняете строка в JavaScript?
Спасибо за помощь!
Ответы
Ответ 1
Здесь вариант answer by guest271314, который обрабатывает более двух последовательных разделителей:
var text = "We.need.to...split.asap";
var re = /(\.*[^.]+)\./;
var items = text.split(re).filter(function(val) { return val.length > 0; });
Он использует деталь, которая, если выражение split включает группу захвата, захваченные элементы включаются в возвращаемый массив. Эти группы захвата на самом деле единственное, что нас интересует; токены - это все пустые строки, которые мы отфильтровываем.
EDIT: К сожалению, возможно, есть одна небольшая ошибка. Если текст, который нужно разбить, начинается с разделителя, который будет включен в первый токен. Если это проблема, ее можно устранить с помощью:
var re = /(?:^|(\.*[^.]+))\./;
var items = text.split(re).filter(function(val) { return !!val; });
(Я думаю, что это регулярное выражение является уродливым и будет приветствовать улучшение.)
Ответ 2
Вы можете сделать это без каких-либо взглядов:
var subject = "We.need.to....split.asap";
var regex = /\.?(\.*[^.]+)/g;
var matches, output = [];
while(matches = regex.exec(subject)) {
output.push(matches[1]);
}
document.write(JSON.stringify(output));
Ответ 3
Примечание.. Этот ответ не может обрабатывать более двух последовательных разделителей, поскольку он был написан в соответствии с примером в ревизии 1 вопроса, что было не очень ясно о таких случаях.
var text = "We.need.to..split.asap";
// split "." if followed by "."
var res = text.split(/\.(?=\.)/).map(function(val, key) {
// if `val[0]` does not begin with "." split "."
// else split "." if not followed by "."
return val[0] !== "." ? val.split(/\./) : val.split(/\.(?!.*\.)/)
});
// concat arrays `res[0]` , `res[1]`
res = res[0].concat(res[1]);
document.write(JSON.stringify(res));