在C#中匹配varName $ [index]和@varName [index](正则表达式帮助)

时间:2014-12-16 23:10:28

标签: c# regex

在此字符串中:

"lorem$ dolor @sit ipsum amet$[consectetuer$[5]] @adipiscing[@elit[3]]"

我想匹配以下内容:

lorem$ 
@sit
amet$[consectetur$[5]]
@adipiscing[@elit[3]]

我差点把表达下来,但由于某种原因,我无法得到它。这是我的测试程序。这是我到目前为止所做的:

Regex varEx = new Regex(@"(?<Variable>([\w\d]+\$|\@[\w\d]+))(\s*\[(?<Index>.*?)\]|[\W\D\s])");

string test = "lorem$ dolor @sit ipsum amet$[consectetuer$[5]] @adipiscing[@elit[3]]";

foreach (Match m in varEx.Matches(test)) {
     Console.WriteLine("{0,10}  {1}", "Match:", m.Value);
     Console.WriteLine("{0,10}  {1}", "Variable:", m.Groups["Variable"].Value);
     Console.WriteLine("{0,10}  {1}", "Index:", m.Groups["Index"].Value);
     Console.WriteLine();
}

程序输出:

   Match:  lorem$
Variable:  lorem$
   Index:

   Match:  @sit
Variable:  @sit
   Index:

   Match:  amet$[consectetuer$[5]
Variable:  amet$
   Index:  consectetuer$[5

   Match:  @adipiscing[@elit[3]
Variable:  @adipiscing
   Index:  @elit[3

几乎正确!最后两场比赛只是缺少最后一个括号。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您只是设置为捕获其中一个]

您需要向]命名组添加另一个终止Index以捕获它

改变这个:

(?<Variable>([\w\d]+\$|\@[\w\d]+))(\s*\[(?<Index>.*?)\]|[\W\D\s])

对此:

(?<Variable>([\w\d]+\$|\@[\w\d]+))(\s*\[(?<Index>.*?\]+)\]|[\W\D\s])

请参阅test