JS Разделение строк с помощью RegEXP
Помогите пожалуйста, делаю свой редактор и не могу правильно построить регулярку чтобы она делила текст по блочно;
arrayList = ['text','[bold]test[/bold]','[size args="1px"][/size]', etc...]
Ответы (2 шт):
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\"]" ]
План у запроса думаю будет "лютый", но должен работать как надо по идее)
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));
