Я пытаюсь создать функцию, которая принимает строку и разделитель и разбивает строку на массив, сохраняя при этом разделитель, используя нечувствительность к регистру для поиска и сохраняя исходный регистр.
Например, подпись функции должна выглядеть так:
advanced_split("Test Round Start", "St")
И он должен вернуться:
["Te", "st", " Round ", "St", "art"]
Обратите внимание, что разделение выполняется без учета регистра, но регистр в исходной строке сохраняется в выходном массиве.
Это сделает это.
function advanced_split(string, delimiter) {
return string.split(new RegExp(`(${delimiter})`, 'i'));
}
advanced_split("Test Round Start", "St") // ["Te", "st", " Round ", "St", "art"]
Он использует группу захвата для извлекать части разделителя каждого разделения, сохраняя регистр. Флаг i
в регулярном выражении означает, что оно будет нечувствительным к регистру.
Стоит отметить, что чтобы сделать эту функцию более надежной, вы должны использовать функцию цитирование регулярных выражений для разделителя, в противном случае функция может аварийно завершить работу на строках разделителей, которые содержат специальные символы в регулярных выражениях.
Самый неоптимизированный подход - это вложенный цикл:
const string = "Test Round Start", find = "St";
const result = [];
let acc = "";
for(let i = 0; i < string.length; i++) {
var found = true;
for(let k = 0; k < find.length && k + i< string.length; k++) {
if (string[k + i] !== find[k]) {
found = false;
break;
}
}
if (found) {
result.push(acc, string.slice(i, k));
acc = "";
i += k;
} else {
acc += string[i];
}
}
result.push(acc);
Это идеально, чисто и эффективно. Именно то, что я искал. Спасибо!