Это на самом деле не лучшая работа для одного регулярного выражения - рассматривали ли вы, например, создание копии строки и затем удаление всего, что заключено в квадратные скобки? Тогда было бы довольно просто извлечь вещи из скобок. В качестве альтернативы, вы можете написать очень простой синтаксический анализатор, который разбивает строку на строки (на обычный текст, квадратные скобки и текст в скобках, я думаю), а затем анализирует дерево, которое создает; изначально это было бы больше работы, но сделало бы жизнь намного проще, если позже вы захотите усложнить поведение.
Сказав это, /(?:(?:^|\])[^\[]*)\((.*?)\)/
поможет вашему тестовому примеру (но он почти наверняка будет вести себя странно, если ваши [
и ]
не будут правильно сопоставлены, и я не уверен, эффективный).
Быстрый (PHP) тестовый пример:
preg_match_all('/(?:(?:^|\])[^\[]*)\((.*?)\)/', "My name is ... (Jill)", $m);
print(implode(", ", $m[1]));
Выходы:
Richard, Robert, Jill