Есть строка, представляющая собой название и значения переменной перечислимого типа:
variable <name> {<value1>, <value2>, <value3>, ...}
В виде регулярного выражения это записывается следующим образом:
@"variable\s+"+@"(?<name>\S+)\s*\{\s*(?<value1>\S+)\s*(,\s*(?<valueI>\S+))*\}"
Как можно извлекать эти valueI?
Точное их количество неизвестно...
Здравствуйте, zaika, Вы писали:
Z>Как можно извлекать эти valueI?
Z>Точное их количество неизвестно...
Вот выражение
variable\s+(?<name>[a-zA-Z_$][a-zA-Z0-9_$]*)\s*\{\s*(?<value>[^,\s]+)\s*(\,\s*(?<value>[^,\s]+)\s*)*\}
вот на этих данных я тестил
variable name1{value1,value2,value3}
variable name2 {value1, value2, value3}
variable name3 { value1, value2,value3 }
и вот код на C#
static void Main(string[] args)
{
Test("variable name1{value1,value2,value3}");
Test("variable name2 {value1, value2, value3}");
Test("variable name3 { value1, value2, value3 }");
Console.ReadLine();
}
static private void Test(string input)
{
Regex regex = new Regex(@"variable\s+(?<name>[a-zA-Z_$][a-zA-Z0-9_$]*)\s*\{\s*(?<value>[^,\s]+)\s*(\,\s*(?<value>[^,\s]+)\s*)*\}",
RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Singleline);
Match m = regex.Matches(input)[0];
if(m.Success)
{
StringBuilder res = new StringBuilder(input.Length);
res.AppendFormat("variable {0} {{", m.Groups["name"].Value);
CaptureCollection vals = m.Groups["value"].Captures;
for(int i = 0; i < vals.Count; i++)
{
if(i == 0)
res.Append(vals[i].Value);
else
res.AppendFormat(", {0}", vals[i].Value);
}
res.Append("}");
Console.WriteLine("======================================");
Console.WriteLine("Input: {0}", input);
Console.WriteLine("Result: {0}", res.ToString());
Console.WriteLine("======================================");
}
... << RSDN@Home 1.1.4 beta 7 rev. 447>>