Вы правы, что жадность - это проблема:
--A--Z--A--Z--
^^^^^^^^^^
A.*Z
Если вы хотите сопоставить оба значения A--Z
, вам придется использовать A.*?Z
(?
делает *
"неохотным" или ленивым).
Иногда есть лучшие способы сделать это, например,
A[^Z]*+Z
При этом используется отрицательный класс символов и собственнический квантификатор, чтобы уменьшить откат и, вероятно, будет более эффективным.
В вашем случае, регулярное выражение будет:
/(\[[^\]]++\])/
К сожалению Регулярное выражение Javascript не поддерживает собственнический квантификатор, поэтому вам просто нужно сделать следующее:
/(\[[^\]]+\])/
Смотри также
Краткое резюме
* Zero or more, greedy
*? Zero or more, reluctant
*+ Zero or more, possessive
+ One or more, greedy
+? One or more, reluctant
++ One or more, possessive
? Zero or one, greedy
?? Zero or one, reluctant
?+ Zero or one, possessive
Обратите внимание, что неохотные и притяжательные квантификаторы также применимы к конструкциям с конечным повторением {n,m}
.
Примеры на Java:
System.out.println("aAoZbAoZc".replaceAll("A.*Z", "!")); // prints "a!c"
System.out.println("aAoZbAoZc".replaceAll("A.*?Z", "!")); // prints "a!b!c"
System.out.println("xxxxxx".replaceAll("x{3,5}", "Y")); // prints "Yx"
System.out.println("xxxxxx".replaceAll("x{3,5}?", "Y")); // prints "YY"