使用RegularExpressions解析和执行方法

时间:2014-10-18 17:27:35

标签: c# regex

我试图为我的服务编写一种迷你型脚本语言,而且我一直试图从一行中的某些字符串中提取数据。例如:

!d3 Profile: {D3Api("Name")} !weather Current Weather {Weather("Location")}

使用我当前的代码,我似乎无法找到我正在寻找的文本。如果该行包含说if{D3Api()}对,我可以执行{Weather()}语句吗?无论如何,这里是我找到文本{D3Api()}并检索文本的表达式:

String text = "Profile: (\\{D3Api\\(\"(.?)\"\\)\\})";
Regex r = new Regex(text , RegexOptions.IgnoreCase | RegexOptions.Singleline);

它没有解析或返回文本。我怎样才能改善这个?

我设计糟糕的解析代码:

public static void Main(string[] args) {
    string t = "{D3Api(\"Name\")";
    String text = "(\\{D3Api\\(\"(.*?)\"\\)\\})";
    Regex r = new Regex(text, RegexOptions.IgnoreCase | RegexOptions.Singleline);  
    Console.WriteLine("Parsing..\n\r");
    Match m = r.Match(t);
    if (m.Success) {
            string c = m.Groups[1].ToString();
            string s = m.Groups[2].ToString();
            Console.Write("(" + c.ToString() + ")" + "(" + s.ToString() + ")" + "\n");
    }
    Console.ReadLine();
}

2 个答案:

答案 0 :(得分:1)

我不是100%确定我是否真的在回答您的问题,但我认为您希望找到已命名的群组。这是使用像(?<function>[a-zA-Z0-9]+)\((?<param>[^)]\)这样的正则表达式语法完成的。使用此功能,您可以为函数名称设置通用格式并获取单个参数。有关命名组的更多信息,请查看here

顺便说一句,如果您的语言很复杂,那么您可能会发现RegEx不够强大,无法满足您的需求。在这种情况下,我建议看一下使用EBNF创建自定义语法,然后创建一个标记器(非常有趣的项目IMO)。可以看到here

的一个例子

答案 1 :(得分:0)

您没有使用量词。您可以使用*,这意味着匹配前一个令牌0次或更多次。

String text = "(\\{D3Api\\(\"(.*?)\"\\)\\})";
Regex r = new Regex(text , RegexOptions.IgnoreCase | RegexOptions.Singleline);

完成上述操作后,如果您想要多次匹配,可以使用Regex.MatchMatches