Снаружи скобок означает сбалансированный текст.
Решение состоит в том, чтобы сопоставить сбалансированный текст в строке с текстом, который вы хотите
найти наружу сбалансированный текст.
Вы делаете это так:
Глобально найти:
(?s)(?:(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).)+?.*?(?=\1)[^(]*(?=\2$)|(?!to|[()]).)*?((?:(?!(?=\()(?:(?=.*?\((?!.*?\4)(.*\)(?!.*\5).*))(?=.*?\)(?!.*?\5)(.*)).)+?.*?(?=\4)[^(]*(?=\5$))(?!to|[()]).)*)(to)
Чтобы увидеть, что вы нашли, замените на
<$3$6>
Образец текста перед:
to (F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third))))))) hello to
where is a to and this is also to
(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))
((123),(456),(789))
(a turn; a task (a turn of work); to turn; Tongan cause Tongan turn) (dsaf)
This is a you to as well as this to here ( asdf )
Затем после замены:
<to>< hello to><
where is a to>< and this is also to><
This is a you to>< as well as this to> here ( asdf )
Демо
регулярное выражение:
"(?s)(?:(?=\\()(?:(?=.*?\\((?!.*?\\1)(.*\\)(?!.*\\2).*))(?=.*?\\)(?!.*?\\2)(.*)).)+?.*?(?=\\1)[^(]*(?=\\2$)|(?!to|[()]).)*?((?:(?!(?=\\()(?:(?=.*?\\((?!.*?\\4)(.*\\)(?!.*\\5).*))(?=.*?\\)(?!.*?\\5)(.*)).)+?.*?(?=\\4)[^(]*(?=\\5$))(?!to|[()]).)*)(to)"
Regex читаемый код:
(?s)
(?:
(?= \( )
(?:
(?=
.*? \(
(?! .*? \1 )
( # (1 start)
.* \)
(?! .* \2 )
.*
) # (1 end)
)
(?=
.*? \)
(?! .*? \2 )
( .* ) # (2)
)
.
)+?
.*?
(?= \1 )
[^(]*
(?= \2 $ )
| (?! to | [()] )
.
)*?
( # (3 start)
(?:
(?!
(?= \( )
(?:
(?=
.*? \(
(?! .*? \4 )
( # (4 start)
.* \)
(?! .* \5 )
.*
) # (4 end)
)
(?=
.*? \)
(?! .*? \5 )
( .* ) # (5)
)
.
)+?
.*?
(?= \4 )
[^(]*
(?= \5 $ )
)
(?! to | [()] )
.
)*
) # (3 end)
( to ) # (6)
Удачи!