我在写一个正则表达式从一行中拉出一个元素而从另一行拉出另一个元素时遇到了麻烦,但我似乎无法从两个元素中拉出来。
这是我用正则表达式解析的文本(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
答案 0 :(得分:1)
我不确定我是否做对了。
\[MessageTypeName\("([^"]+)"\)\]\s+public\s+class\s+([^:\s]+)
此解决方案中有许多陷阱。它不匹配
[MessageTypeName("x\"y")]
MessageTypeName
和public 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+
- 匹配public
或private
或仅匹配一个或多个字母数字字符_
\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();
输出:
如果类型名称是唯一的,您最好创建一个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]);