如何创建一个从两个线组中拉出来的正则表达式?

时间:2015-05-22 19:20:07

标签: c# regex

我在写一个正则表达式从一行中拉出一个元素而从另一行拉出另一个元素时遇到了麻烦,但我似乎无法从两个元素中拉出来。

这是我用正则表达式解析的文本(c#flavor):

    [MessageTypeName("add-message")]
    public class AddSystemRequestMessage : Message
    {
    }

    [MessageTypeName("add-accept")]
    public class AddAcceptMessage : Message
    {
    }

    [MessageTypeName("add-progress")]
    public class AddProgressMessage : Message
    {
    }

我的目标是解析此代码并获取以下内容(数字是组):

1. add-message
2. AddSystemRequestMessage

1. add-accept
2. AddAcceptMessage

1. add-progress
2. AddProgressMessae

2 个答案:

答案 0 :(得分:1)

我不确定我是否做对了。

\[MessageTypeName\("([^"]+)"\)\]\s+public\s+class\s+([^:\s]+)

此解决方案中有许多陷阱。它不匹配

  • 转发了[MessageTypeName("x\"y")]
  • 等字符串
  • 如果MessageTypeNamepublic class
  • 之间存在其他属性
  • 如果课程不是public
  • 如果属性具有多个和/或命名参数
  • 如果字符串中有类似内容
  • ...

你说出来了!

我建议使用命名组

\[MessageTypeName\("(?<type>[^"]+)"\)\]\s+public\s+class\s+(?<class>[^:\s]+)

这只是麻烦......

答案 1 :(得分:0)

您可以使用以下正则表达式:

\[MessageTypeName\("([^"]+)"\)\]\s*\w+\s+class\s+([^\s:]+)

如果您的班级签名包含private,则此正则表达式也会有效,而不仅仅是public

正则表达式解释:

  • \[MessageTypeName\(" - 匹配文字[MessageTypeName("
  • ([^"]+) - 匹配双引号以外的1个或多个字符
  • "\) - 匹配双引号和文字)
  • \] - 匹配文字]
  • \s* - 匹配任意数量的空白,包括换行符
  • \w+ - 匹配publicprivate或仅匹配一个或多个字母数字字符_
  • \s+ - 匹配1个或更多空格,包括换行符
  • class - 匹配class substring
  • \s+ - 匹配1个或更多空格,包括换行符
  • ([^\s:]+)捕获由空格和冒号以外的任何内容组成的类名。

您要查找的值在第1组和第2组中。

请参阅demo

C#示例代码:

var str = "[MessageTypeName(\"add-message\")]\n    public class AddSystemRequestMessage : Message\n    {\n    }";
var rx = new Regex(@"\[MessageTypeName\(""([^""]+)""\)\]\s*\w+\s+class\s+([^\s:]+)");
var matches = rx.Matches(str).Cast<Match>().Select(p => new[] { p.Groups[1].Value, p.Groups[2].Value }).ToList();

输出:

enter image description here

如果类型名称是唯一的,您最好创建一个Dictionary对象:

var matches = rx.Matches(str).Cast<Match>().Select(t => new string[] { t.Groups[1].Value, t.Groups[2].Value }).ToDictionary(t => t[0], t => t[1]);

enter image description here