Это будет двухэтапный процесс
Шаг 1: Извлечение функционального имени и всех аргументов
Шаг 2: Извлечение каждого имени аргумента из списка всех аргументов
Шаг 1:
Позволяет применить это регулярное выражение ^\S+\s+([^(]+)\(([^)]+)*
к этой строке void Write(int *p,int a, int b, str *v)
эта тестовая строка
^ # start of string
\S+ # one or more occurence of any non space charactcers
# matches `void`
\s+ # one or more occurence of a space character
# matches the space after `void`
([^(]+) # all characters until opening parenthesis
# matches `Write` and capture it
\( # literally matches opening parenthesis
([^)]+) # matches all characters till closing parenthesis is encountered
# matches arguments signature i.e. `int *p,int a, int b, str *v`
* # matches zero or more occurrence of last capturing group
# last capturing group is string between the parenthesis
# so this star handle the corner case when the argument list is empty
Подробнее: https://regex101.com/r/0m1vs9/2
Шаг 2
Теперь к списку аргументов (int *p,int a, int b, str *v
) примените это регулярное выражение \s*\S+\s+([^,]+),?
с глобальным модификатором
Этот шаблон сопоставляет текст между запятыми, поэтому давайте объясним шаблоны, предполагая одинаковые
\s* # matches zero or more occurrences of a space character
# this will match any spaces after comma e.g. `int b,<space> str`
\S+ # one or more occurrence of non space character
# matches argument type, i.e. `int`
\s+ # one or more occurrence of space characters
# matches the space between argument name and type, e.g. `int<space>b`
([^,]+) # capture all characters till comma
# this matches the actual argument name
# and also matches any spaces after it
,? # zero or one occurrence of a comma
# this ensures that the argument name is immediately followed by a comma
# this also handles the case for the last argument which doesn't have any comma after it
Подробнее: https://regex101.com/r/9ju60l/1
Надеюсь, что поможет