Так как никто не пришел, я выкину это, чтобы вы начали.
Это регулярное выражение будет соответствовать таким вещам, как
aa(a , sd,,,f,)
aa( as , " ()asdf)) " ,, df, , )
asdf()
, но не
'ab(s)
Это решит основную проблему (?<!['\w])\w*
Где (?<!['\w])
не позволит двигателю пропустить слово char только
, чтобы удовлетворить не цитату .
Затем необязательные слова \w*
для захвата всех слов.
И если перед ним стоит кавычка 'aaa(
, то она не будет совпадать.
Это регулярное выражение здесь украшает то, что, я думаю, вы пытаетесь выполнить
в функциональной части тела вашего регулярного выражения.
Поначалу это может показаться немного ошеломляющим.
(?s)(?<!['\w])(\w*)\(((?:,*(?&variable)(?:,+(?&variable))*[,\s]*)?)\)(?(DEFINE)(?<variable>(?:\s*(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\s*|[^()"',]+)))
Версия для чтения (через: http://www.regexformat.com)
(?s) # Dot-all modifier
(?<! ['\w] ) # Not a quote, nor word behind
# <- This will force matching a complete function name
# if it exists, thereby blocking a preceding quote '
( \w* ) # (1), Function name (optional)
\(
( # (2 start), Function body
(?: # Parameters (optional)
,* # Comma (optional)
(?&variable) # Function call, get first variable (required)
(?: # More variables (optional)
,+ # Comma (required)
(?&variable) # Variable (required)
)*
[,\s]* # Whitespace or comma (optional)
)? # End parameters (optional)
) # (2 end)
\)
# Function definitions
(?(DEFINE)
(?<variable> # (3 start), Function for a single Variable
(?:
\s*
(?: # Double or single quoted string
"
[^"\\]*
(?: \\ . [^"\\]* )*
"
|
'
[^'\\]*
(?: \\ . [^'\\]* )*
'
)
\s*
| # or,
[^()"',]+ # Not quote, paren, comma (can be whitespace)
)
) # (3 end)
)