在Regex中查找字符串匹配,放入变量,棘手的字符串

时间:2013-06-19 05:44:30

标签: c# regex

我在这个正则表达式中非常新,还有很多我不理解。

  1. 我看到很多@,但我在MSDN中找不到它。什么是@ for?例如: Regex regex = new Regex(“@ {lalala}”,RegexOptions.Compiled);

  2. 这就是我遇到的麻烦。我有这个字符串。

    {BaseClass.InheritClass,Tuple.Create( “MachineState” 的String.Empty)},

  3. 我想要做的是获取InheritClass和MachineState的名称,将其放入变量中。

    我试过了:

    Regex regex = new Regex(@"\{BaseClass.(?<inheritClassStr>\d+),Tuple.Create\(""(?<machineStateStr>\d+)"",string.Empty\)\},", RegexOptions.Compiled);
    

    我希望稍后在代码中我能做到这样的事情:

    string inheritClassString = inheritClassStr;
    string machineStateString = machineStateStr;
    

    但它不起作用,我不知道如何调试它。我不知道正则表达式捕获了什么,所以我很难调试。

    非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你所追求的是(正则表达式):

\{BaseClass.(?<inheritClassStr>.*?),Tuple.Create\("(?<machineStateStr>.*?)",string.Empty\)\}

澄清:

您使用的

\d仅数学数字,但C#中的标识符也包含字母。

.*会以贪婪的方式对任何角色进行数学运算(所以越多越好)所以这不是一个好选择

.*?会对任何角色进行数学计算,但不要贪婪(尽可能小的设置)

C#中没有魔法所以你在正则表达式中的声明不会被转换为变量,但是你需要访问这些:

var inheritClassString = regex.Groups["inheritClassStr"].Value;

字符串开头的@表示c#编译器不会尝试解释可以放入的特殊字符,否则不会加前缀字符串,例如\t\n\r制表符,新行,回车符。