C# 字符串操作以提取特定模式的子字符串

C# 字符串操作以提取特定模式的子字符串,c#,C#,我在c中有以下字符串 Count([AssignedTo]) as [AssignedTo] , Sum([Billing Amount]) as [Billing Amount] , Max([Billing Rate]) as [Billing Rate] , Min([ExecutionDate]) as [ExecutionDate] , Average([HoursSpent]) as [HoursSpent] , [Project], [Sub-Project], [TaskName

我在c中有以下字符串

Count([AssignedTo]) as [AssignedTo] , Sum([Billing Amount]) as [Billing Amount] , Max([Billing Rate]) as [Billing Rate] , Min([ExecutionDate]) as [ExecutionDate] , Average([HoursSpent]) as [HoursSpent] , [Project], [Sub-Project], [TaskName], [Vendor], [Work Classification], [Work Done], Count([WorkItemType]) as [WorkItemType]  
现在,我想通过字符串操作或linq,列出所有具有聚合函数的字段

输出类


也许这对你有用:

var aggr = new []{ "Count", "Sum", "Max", "Min", "Average"};
var allAggregates = text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(col => new{ col, token = col.TrimStart().Split().First() })
    .Where(x => x.token.Contains('(') && aggr.Any(a => x.token.StartsWith(a, StringComparison.OrdinalIgnoreCase)))
    .Select(x => x.token);
我可以只获取函数内部的字段名吗

如果可能,我更喜欢字符串方法而不是正则表达式:

var allAggregates = text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(col => new { col, token = col.TrimStart().Split().First() })
    .Where(x => x.token.Contains('(') && aggr.Any(a => x.token.StartsWith(a, StringComparison.OrdinalIgnoreCase)))
    .Select(x => {
        string innerPart = x.token.Substring(x.token.IndexOf('(') + 1);
        int index = innerPart.IndexOf(')');
        if (index >= 0)
            innerPart = innerPart.Remove(index);
        return innerPart;
    });
这是另一种方式:

string[] funcNames =  new string[]{"Sum","Average","Count","Max","Min"};
string s = "Your String";

var output = from v in s.Split(',')  
             where funcNames.Contains(v.Split('(')[0].Trim())
             select v.Split(new string[]{" as "},  
                            StringSplitOptions.RemoveEmptyEntries)[0].Trim();
             .Split('(')[1].Split(')')[0]; //this line is to get only field names

//Print results
foreach(var str in output) Console.WriteLine(str);

@德翁选民请宽容地评论一下,至少我没有投反对票,但这可能是因为你还没有证明你已经尝试过为自己解决这个问题。这里的人们很乐意帮助解决具体问题,但我们不是来为您编写所有代码的。线索:你有一个字符串,你需要把它分成几个部分,然后看看每个部分是否都从一个可能的列表中的一个特定字符串开始。是的@ZombieSheep我试图用谷歌搜索它,但没有什么值得发布的,所以我写道,没有找到任何更具描述性的问题,也许是一些代码,详细信息,如您是尝试打印到控制台还是尝试处理等,将帮助您快速获得答案。例如,您在第一行中指定的字符串不是有效的C字符串文字。您总是摇摆不定,谢谢,老兄,完美的解决方案我可以只得到里面的字段名吗function@pavezalam:编辑我的答案。
var aggregates = new []{ "Count", "Sum", "Max", "Min", "Average"};
var output=Regex.Matches(input,@"(\w+)\(.*?\)")
                .Cast<Match>()
                .Where(x=>aggregates.Any(y=>y==x.Groups[1].Value))
                .Select(z=>z.Value);
string[] funcNames =  new string[]{"Sum","Average","Count","Max","Min"};
string s = "Your String";

var output = from v in s.Split(',')  
             where funcNames.Contains(v.Split('(')[0].Trim())
             select v.Split(new string[]{" as "},  
                            StringSplitOptions.RemoveEmptyEntries)[0].Trim();
             .Split('(')[1].Split(')')[0]; //this line is to get only field names

//Print results
foreach(var str in output) Console.WriteLine(str);