在.NET中提取字符串

时间:2009-11-26 02:23:35

标签: c# .net vb.net

我有一个看起来像这样的字符串:

var expression = @"Args("token1") + Args("token2")";

我想检索表达式strings中包含的Args("")集合。

我如何在C#或VB.NET中执行此操作?

4 个答案:

答案 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)

如果您需要token1token2,可以使用以下正则表达式

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);
}