我有一个看起来像这样的字符串:
var expression = @"Args("token1") + Args("token2")";
我想检索表达式strings
中包含的Args("")
集合。
我如何在C#或VB.NET中执行此操作?
答案 0 :(得分:3)
正则表达式:
string expression = "Args(\"token1\") + Args(\"token2\")";
Regex r = new Regex("Args\\(\"([^\"]+)\"\\)");
List<string> tokens = new List<string>();
foreach (var match in r.Matches(expression)) {
string s = match.ToString();
int start = s.IndexOf('\"');
int end = s.LastIndexOf('\"');
tokens.add(s.Substring(start + 1, end - start - 1));
}
非正则表达式(假设字符串格式正确!):
string expression = "Args(\"token1\") + Args(\"token2\")";
List<string> tokens = new List<string>();
int index;
while (!String.IsNullOrEmpty(expression) && (index = expression.IndexOf("Args(\"")) >= 0) {
int start = expression.IndexOf('\"', index);
string s = expression.Substring(start + 1);
int end = s.IndexOf("\")");
tokens.Add(s.Substring(0, end));
expression = s.Substring(end + 2);
}
答案 1 :(得分:1)
如果您需要token1
和token2
,可以使用以下正则表达式
input=@"Args(""token1"") + Args(""token2"")"
MatchCollection matches = Regex.Matches(input,@"Args\(""([^""]+)""\)");
抱歉,如果这不是你想要的。
答案 2 :(得分:1)
使用lookahead和lookbehind断言有另一种正则表达式方法来实现这一点:
Regex regex = new Regex("(?<=Args\\(\").*?(?=\"\\))");
string input = "Args(\"token1\") + Args(\"token2\")";
MatchCollection matches = regex.Matches(input);
foreach (var match in matches)
{
Console.WriteLine(match.ToString());
}
这会剥掉字符串的Args部分,只给出标记。
答案 3 :(得分:0)
如果您的收藏如下:
IList<String> expression = new List<String> { "token1", "token2" };
var collection = expression.Select(s => Args(s));
只要Args返回与查询集合类型相同的类型,这应该可以正常工作
然后您可以像这样迭代集合
foreach (var s in collection)
{
Console.WriteLine(s);
}