РЕДАКТИРОВАТЬ: Это будет работать, использует 2 регулярных выражений. Первый получает имя функции и все внутри нее, второй извлекает каждую пару параметров и значений из того, что находится внутри скобок функции. Вы не можете сделать это с помощью одного регулярного выражения. Добавьте немного [ \t\n\r]*
для пробела.
Regex r = new Regex(@"(?<function>\w[\w\d]*?)\((?<inner>.*?)\)");
Regex inner = new Regex(@",?(?<param>.+?):""(?<value>[^""]*?)""");
string input = "_test0(a:\"lolololol\",b:\"2\") _test1(ghgasghe:\"asjkdgh\")";
List<List<string>> matches = new List<List<string>>();
MatchCollection mc = r.Matches(input);
foreach (Match match in mc)
{
var l = new List<string>();
l.Add(match.Groups["function"].Value);
foreach (Match m in inner.Matches(match.Groups["inner"].Value))
{
l.Add(m.Groups["param"].Value);
l.Add(m.Groups["value"].Value);
}
matches.Add(l);
}
(Старый) Решение
(?<function>\w[\w\d]*?)\((?<param>.+?):"(?<value>[^"]*?)"\)
(Старый) Пояснение
Давайте удалим групповые снимки, чтобы их было легче понять: \w[\w\d]*?\(.+?:"[^"]?"\)
\w
- это слово класс, оно сокращенно от [a-zA-Z_]
\d
- это класс цифр, оно сокращенно от [0-9]
\w[\w\d]*?
Обеспечивает наличие допустимого символа слова для начала функции, а затем сопоставляет ноль или более других слов или цифр.
\(.+?
Соответствует левой скобке, затем одному или нескольким любым символам (для параметра)
:"[^"]*?"\)
Соответствует двоеточию, открывающей кавычке, затем нулю или более любого символа, кроме кавычек (для значения), затем закрывающей кавычки и правой скобки.
Скобки (или парены, как их называют некоторые люди), когда избежали с обратными слешами, потому что в противном случае они захватывают группы.
(?<name> )
захватывает некоторый текст.
?
после каждого оператора *
и +
делает их нежадными , что означает, что они будут соответствовать наименьшему, а не большому количеству текста.
(Старый) Использование
Regex r = new Regex(@"(?<function>\w[\w\d]*?)\((?<param>.+?):""(?<value>[^""]*?)""");
string input = "_test0(aa%£$!:\"lolololol\") _test1(ghgasghe:\"asjkdgh\")";
List<string[]> matches = new List<string[]>();
if(r.IsMatch(input))
{
MatchCollection mc = r.Matches(input);
foreach (Match match in mc)
matches.Add(new[] { match.Groups["function"].Value, match.Groups["param"].Value, match.Groups["value"].Value });
}
РЕДАКТИРОВАТЬ: Теперь вы добавили неопределенное количество нескольких параметров, я бы рекомендовал создать свой собственный анализатор, а не использовать регулярные выражения. Приведенный выше пример работает только с одним параметром и без пробелов. Это будет соответствовать нескольким параметрам со строгим пробелом, но не вернет параметры и значения:
\w[\w\d]*?\(.+?:"[^"]*?"(,.+?:"[^"]*?")*\)
Просто для удовольствия, как выше, но с пробелами:
\w[\w\d]*?[ \t\r\n]*\([ \t\r\n]*.+?[ \t\r\n]*:[ \t\r\n]*"[^"]*?"([ \t\r\n]*,[ \t\r\n]*.+?[ \t\r\n]*:[ \t\r\n]*"[^"]*?")*[ \t\r\n]*\)
Захватить нужный вам текст будет сложно, потому что вы не знаете, сколько снимков у вас будет, и такие регулярные выражения не подходят.