re = /(?x)
.+(?:Sub|Function)\ (\w+)\( # method declaration
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
(?: # start of parameter pattern
[\w\W]*?(?<=\b) # parameter may be preceded by ByVal or Optional keywords
([a-z]\w+)+ # parameter starts with a lower case
.*? # parameter may be followed by its type declaration
(?:=\ ([^\,]+)){0,1} # optional parameters may be followed by default value, it is captured to be used in method call
(?:,|\)) # parameter is followed by , or )
){0,1} # end of parameter pattern (may be copy-pasted infinitely to capture all parameters)
/m
str = 'Public Function BrowseToDictTreeNode(ByVal rootNode As Scripting.Dictionary, ByVal browseKey As String, ByVal nodeUrl As String, _
Optional ByVal urlSlash As String = "/", Optional ByVal childrenKey As String = "Children", _
Optional ByVal startAtLevel As Integer = 1) As Scripting.Dictionary
'
subst = '#Sub call\\n$1 $2:=$3, $4:=$5, $6:=$7, $8:=$9, $10:=$11, $12:=$13, $14:=$15, $16:=$17, $18:=$19, $20:=$21, $20:=$21, $22:=$23, $24:=$25\\n\\n#Function call\\n$1($2:=$3, $4:=$5, $6:=$7, $8:=$9, $10:=$11, $12:=$13, $14:=$15, $16:=$17, $18:=$19, $20:=$21, $20:=$21, $22:=$23, $24:=$25)\\n\\n#Recursive Sub call\\n$1 $2:=$2, $4:=$4, $6:=$6, $8:=$8, $10:=$10, $12:=$12, $14:=$14, $16:=$16, $18:=$18, $20:=$20, $22:=$22, $24:=$24, \\n\\n#Recursive Function call\\n$1($2:=$2, $4:=$4, $6:=$6, $8:=$8, $10:=$10, $12:=$12, $14:=$14, $16:=$16, $18:=$18, $20:=$20, $22:=$22, $24:=$24, )'
result = str.gsub(re, subst)
# Print the result of the substitution
puts result
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html