Частично причина, по которой ваше решение не удалось, состоит в том, что вы, вероятно, должны были использовать .*?)
вместо жадного сопоставления.
Полный ответ должен следовать, по крайней мере, так:
Игнорировать скобки в строках и символах (что можно сделать с помощью регулярного выражения, хотя с экранированием это может быть немного сложнее)
functionCall("\")", ')')
Игнорировать скобки в комментариях (что можно сделать с помощью регулярного выражения)
functionCall(/*)*/ 1, // )
2)
Не подходите слишком часто (что вы можете сделать с помощью регулярных выражений)
functionCall(1) + functionCall(2) + (2 * 3) // Don't match past the first )
но он также должен игнорировать сбалансированные скобки
functionCall((1+(1))*(2+2))
Это последнее, что вы не можете сделать с обычным регулярным выражением, потому что оно включает в себя подсчет скобок, и обычно это то, для чего регулярные выражения не подходят. Однако, похоже, что .NET имеет способы сделать это .
(А технически вам придется работать с макросами, я могу представить
#define close_paren )
испортило бы ваш день ...)
Тем не менее, вы, вероятно, могли бы придумать наивное решение (похожее на то, что у вас было, или то, что рекомендует какой-то другой плакат), и оно работало бы во многих случаях, особенно если вы работаете с известными материалами.