Если ваши строки внутри [[
и ]]
не имеют [
и ]
простого
/(foo|bar|baz)="([^"]+)"(?=[^\][]*]])/g
будет работать для вас. Часть (?=[^\][]*]])
обеспечит наличие 0 или более символов, отличных от [
и ]
, а затем ]
будут сразу справа от текущего местоположения. См. regex demo .
Самое безопасное решение состоит из двух шагов: 1) получить значение группы 1 с помощью /\[\[((foo|bar|baz)="([^"]+)"(?:\|(foo|bar|baz)="([^"]+)")*)]]/
(или более простого, но менее точного, но более универсального /\[\[\w+="[^"]+"(?:\|\w+="[^"]+")*]]/g
, см. demo ) и 2) используйте /(foo|bar|baz)="([^"]+)"/g
(или /(\w+)="([^"]+)"/g
), чтобы извлечь необходимые значения из группы 1.
const x = '(foo|bar|baz)="([^"]+)"'; // A key-value pattern block
const regex = new RegExp(`\\[\\[(${x}(?:\\|${x})*)]]`, 'g'); // Extracting the whole `[[]]`
const str = `Look for \`foo="x"\` ONLY between the specific double block quote delimiters [[foo="x"|bar="y"|baz="z"]]`;
let m;
while (m = regex.exec(str)) {
let results = [...m[1].matchAll(/(foo|bar|baz)="([^"]+)"/g)]; // Grabbing individual matches
console.log(Array.from(results, m => [m[1],m[2]]));
}
Шаблон \[\[((foo|bar|baz)="([^"]+)"(?:\|(foo|bar|baz)="([^"]+)")*)]]
будет соответствовать
\[\[
- [[
((foo|bar|baz)="([^"]+)"(?:\|(foo|bar|baz)="([^"]+)")*)
- Группа 1:
(foo|bar|baz)
- foo
, bar
или baz
=
- =
"([^"]+)"
- "
, 1 или более символов, отличных от "
и "
(?:\|(foo|bar|baz)="([^"]+)")*
- 0 или более повторений |
и шаблон, описанный выше
]]
- ]]
подстрока.
См. Демоверсию regex .