Подтвердить что ты не робот

Как разбить строку символом, которому не предшествует символ того же типа?

Скажем, у меня есть строка: "We.need..to...split.asap". То, что я хотел бы сделать, это разделить строку на разделитель ., но я хочу разделить только первым . и включить в повторяющийся токен любой повторяющийся ..

Ожидаемый результат:

["We", "need", ".to", "..split", "asap"]

В других языках я знаю, что это возможно с помощью look-behind /(?<!\.)\./, но Javascript, к сожалению, не поддерживает такую ​​функцию.

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

Я рассматривал возможность изменения строки, а затем повторное обращение к токенам, но это похоже на слишком много работы за то, что я получаю после... плюс споры: Как вы меняете строка в JavaScript?

Спасибо за помощь!

4b9b3361

Ответ 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));