Как правило, вам потребуется два шага, чтобы получить все данные.
Сначала сопоставьте / подтвердите всю функцию:
function\((?<parameters>((\/\*[a-zA-Z]+\*\/)?[0-9a-zA-Z_$]+,?)*)\)
Обратите внимание, что теперь у вас есть группа parameters
со всеми параметрами,Вы можете снова сопоставить некоторые паттерны, чтобы получить все совпадения параметров, или в этом случае разделить их на ,
.
. Если вы используете .Net, то, по любому случаю, вам повезло..Net хранит полную запись всех захватов каждой группы, поэтому вы можете использовать коллекцию:
match.Groups["param"].Captures
Некоторые примечания:
- Если вы хотите захватить более одного типа, вам определенно нужны пустые совпадения , так что вы можете легко комбинировать совпадения (хотя вы можете сортировать, но захват 1-к-1 лучше).В этом случае вам понадобится дополнительная группа внутри вашей захваченной группы:
(?<type>(\/\*[a-zA-Z]+\*\/)?)
- Вам не нужно избегать косых черт в шаблонах .Net -
/
не имеет там особого значения(C # /. Net не имеет разделителей регулярных выражений).
Вот пример использования перехватов.Опять же, главное - поддерживать связь между type
и param
: вы хотите захватывать пустые типы, чтобы не терять счет.
Pattern:
function
\(
(?:
(?:
/\*(?<type>[a-zA-Z]+)\*/ # type within /* */
| # or
(?<type>) # capture an empty type.
)
(?<param>
[0-9a-zA-Z_$]+
)
(?:,|(?=\s*\))) # mandatory comma, unless before the last ')'
)*
\)
Код:
Match match = Regex.Match(s, pattern, RegexOptions.IgnorePatternWhitespace);
CaptureCollection types = match.Groups["type"].Captures;
CaptureCollection parameters = match.Groups["param"].Captures;
for (int i = 0; i < parameters.Count; i++)
{
string parameter = parameters[i].Value;
string type = types[i].Value;
if (String.IsNullOrEmpty(type))
type = "NO TYPE";
Console.WriteLine("Parameter: {0}, Type: {1}", parameter, type);
}