Я пытаюсь string.matchAll
следующую строку:
const text = 'textA [aaa](bbb) textB [ccc](ddd) textC'
Я хочу сопоставить следующее:
- 1st:
"textA [aaa](bbb)"
- 2-й:
" textB [ccc](ddd)"
- 3-й:
" textC"
ПРИМЕЧАНИЕ: Группы захвата уже присутствуют в regex
.Это то, что мне нужно.
Это почти работает, но до сих пор я не мог придумать, как сопоставить последнюю часть строки, которая является просто " textC"
, и не имеет [*](*)
pattern.
Что я делаю не так?
const text = 'textA [aaa](bbb) textB [ccc](ddd) textC'
const regexp = /(.*?)\[(.+?)\]\((.+?)\)/g;
const array = Array.from(text.matchAll(regexp));
console.log(JSON.stringify(array[0][0]));
console.log(JSON.stringify(array[1][0]));
console.log(JSON.stringify(array[2][0]));
ОБНОВЛЕНИЕ:
Помимо хороших решений, представленных в ответах ниже, это также вариант:
const text= 'textA [aaa](bbb) textB [ccc](ddd) textC'
const regexp = /(?!$)([^[]*)(?:\[(.*?)\]\((.*?)\))?/gm;
const array = Array.from(text.matchAll(regexp));
console.log(array);