Основная проблема заключается в том, что в настоящее время браузеры не поддерживают просмотр задним числом, который необходим для поиска и отмены префикса \
, поэтому мы не включаем \:
.
Один обходной путь (не оченьдовольно, но это работает) - сначала заменить \:
на некоторый «символ», который, как вы знаете, не встречается в вашем тексте естественным образом, произведет разделение, а замена вернет любой \:
.
Например, этот метод вернет пустой элемент "", если у вас есть "::" в вашей строке:
let regex = /:(?!\/\/)/
//original string literal \: has to be expressed as \\:
let str = "http://example.com::hello:dolly:12\\:00\\:PM";
//substitute out any \:
str = str.replace(/\\:/g,"<colon>"); //http://example.com::hello:dolly:12<colon>00<colon>PM
//now we split 'normally' without lookbehind
let arr = str.split(regex); //[ 'http://example.com', '', 'hello', 'dolly', '12\\:00\\:PM' ]
//substitute back \:
arr = arr.map(element => element.replace(/<colon>/g, "\\:")); //[ 'http://example.com', '', 'hello', 'dolly', '12\\:00\\:PM' ]
console.log(arr);
Если вы просто посленепустые элементы, вы можете просто сделать на нем arr.filter(Boolean)
или просто использовать соответствующее решение @ Skeeve, поскольку оно более элегантно для этой цели.