JS Разделение строк с помощью RegEXP

Помогите пожалуйста, делаю свой редактор и не могу правильно построить регулярку чтобы она делила текст по блочно;

arrayList = ['text','[bold]test[/bold]','[size args="1px"][/size]', etc...]

введите сюда описание изображения


Ответы (2 шт):

Автор решения: the_Solomon
const re = /(\[[^\]]{1,}\][^\[]{1,}\[\/[^\]]{1,}\]|\s+.{1,})/gi

const str = `
[italic]Random italic text[/italic]
[bold]Random bold text[/bold]    

random text
[blabla]][]
random text 2
[href="https://example.com"]Random link[/href="https://example.com"]
`

console.log(str.match(re))
// [ "\n[italic]Random italic text[/italic]", "\n[bold]Random bold text[/bold]    ", "\n\nrandom text", "\n[blabla]][]", "\nrandom text 2", "\n[href=\"https://example.com\"]Random link[/href=\"https://example.com\"]" ]

→ Ссылка
Автор решения: ipatev_nn

План у запроса думаю будет "лютый", но должен работать как надо по идее)

const str = `
[ab] wfgwfw egreg [/ab]
eqe

rerwer
[qwer]wreewr[/qwer]
[b][abc][/abc][def][/fed][abcd][/abcd]
[b][abc][/abc][def][/fed][abcd][/abcd][/b]
[abc][/abc][def][/fed][abc][/abc]
`;
const reg = /\[(.*?\]).*?\[\/\1|(?:(?!\[(.*\]).*\[\/\2).)+/gm;
console.log(str.match(reg));

\[(.*?\]).*?\[\/\1|(?:(?!\[(.*\]).*\[\/\2).)+

\[(.*?\]) В данном блоке получаем начальный тег и берем в группу 1 часть после [
.*? - 0 и больше любых символов, ? - делает квантификатор ленивым
\[\/\1 - [/{подставляется первая захваченная группа}
| - означает или
(?!\[(.*\]).*\[\/\2) - негативный просмотр вперед, проверяющий что дальше не будет открытого и закрытого тега
(?:(?!...).)+ - один и более любых символов, пока не упремся в открывающийся и закрывающийся тег, группа не захватываемая, так как получаем только 0 группу.



UPD: немного доработал для ключа single line, план еще хуже, думаю на больших проектах "цена" данного reg будет очень высока...

/\[(.*?\])(?:(?!\[\1).)*?\[\/\1|(?:(?!\[(.*\])(?:(?!\[\1).)*?\[\/\2).)+/gms

const str = `
[ab] wfgwfw egreg [/ab]
eqe

rerwer
[qwer]wreewr[/qwer]
[b][abc][/abc][def][/fed][abcd][/abcd]
[b][abc][/abc][def][/fed][abcd][/abcd][/b]
[abc][/abc][def][/fed][abc][/abc]
`;
const reg = /\[(.*?\])(?:(?!\[\1).)*?\[\/\1|(?:(?!\[(.*\])(?:(?!\[\2).)*?\[\/\2).)+/gms;
console.log(str.match(reg));

→ Ссылка