/ / регулярний вираз для розділення рядка, уникаючи подвійних лексем - javascript, масиви, регулярний вираз, рядок, розділення

регулярний вираз, щоб розділити рядок, уникаючи подвійних токенів - javascript, масиви, регулярні вирази, рядок, спліт

Для того щоб розділити значення рядка на масив за допомогою 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"]

Я залишаю завдання зробити цю рекурсивну функцію до ОП. Якщо ви хочете певного напряму, я можу спробувати ще трохи зрозуміти.