我试图为我的服务编写一种迷你型脚本语言,而且我一直试图从一行中的某些字符串中提取数据。例如:
!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();
}
答案 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.Match
或Matches
。