Для того щоб розділити значення рядка на масив за допомогою JavaScript, мені потрібно розділити за допомогою роздільників. Повторні роздільники вказують на суб-значення в масиві, наприклад,
abc +! +; def +! +! +; 123 +! +; xyz
слід розділити на abc, [def, 123], xyz
Найближчий мій вираз - це ((?: +! (?! +!)) +; | $), Але я подумав про це, можливо, саме з того, з якого я вперше почав, тому що з тих пір я пережив так багато варіацій.
Напевно, є сліпуче очевидна відповідь, але після того, що здається вічністю, я зараз затуманився. Я подивився на регулярний вираз для розбору рядка з символами, що втекли, і подібні статті, які були близькими, хоча і не однаковою проблемою, але в основному зупинилися на ідеях.
Десь там хтось буде знати регулярні вирази набагато краще, ніж я, і сподіваюся, що у них є відповідь
Відповіді:
1 для відповіді № 1Я змусив це працювати, використовуючи .split()
з цим основний візерунок:
b+!+;b
І потім:
b+!+!+;b
І так далі, і так далі. Вам потрібно буде перетворити це на рекурсивну функцію, але я зробив основну JSFiddle щоб почати. Спочатку ми розділили рядок, використовуючи наш перший вираз. Тоді ми створюємо наш новий вираз, додаючи !+
(це легко зробити динамічно). Тепер ми можемо провести цикл через наш початковий масив, побачити, чи відповідає рядок нашому новому виразу та чи розбиває його знову.
var string = "abc+!+;def+!+!+;123+!+;xyz",
data = string.split(/b+!+;b/);
var regex = /b+!+!+;b/
for(var i = 0; i < data.length; i++) {
var string = data[i];
if(string.match(regex)) {
data[i] = string.split(regex);
}
}
console.log(data);
// ["abc", ["def", "123"], "xyz"]
Я залишаю завдання зробити цю рекурсивну функцію до ОП. Якщо ви хочете певного напряму, я можу спробувати ще трохи зрозуміти.