在长字符串中查找以[和以...结尾]开头的所有字符串部分

时间:2015-10-01 16:04:56

标签: c# .net regex string algorithm

我有一个有趣的问题,我希望找到一个最好的解决方案,我已经尽力使用正则表达式。我想要的是使用正则表达式或任何其他方法使用C#从此字符串中查找所有col_x值。

[col_5] is a central heating boiler manufacturer produce boilers under [col_6]
 brand name . Your selected [col_7] model name is a [col_6] [col_15] boiler.   
[col_6] [col_15] boiler [col_7] model [col_10] came in production untill 
[col_11].  [col_6] model product index number is [col_1] given by SEDBUK 
'Seasonal Efficiency of a Domestic Boiler in the UK'. [col_6] model have 
qualifier [col_8] and GCN  [col_9] 'Boiler Gas Council No'. [col_7] model 
source of heat for a boiler combustion is a [col_12].

预期的输出是一个数组

var data =["col_5","col_10","etc..."]

修改

我的尝试:

string text = "[col_1]cc[col_2]asdfsd[col_3]";
var matches = Regex.Matches(text, @"[[^@]*]");
var uniques = matches.Cast<Match>().Select(match => match.Value).ToList().Distinct();

    foreach(string m in uniques)
    {
        Console.WriteLine(m);

    }

但没有成功。

3 个答案:

答案 0 :(得分:2)

尝试这样的事情:

string[] result = Regex.Matches(input, @"\[(col_\d+)\]").
                            Cast<Match>().
                            Select(x => x.Groups[1].Value).
                            ToArray();

答案 1 :(得分:2)

我认为这就是你所需要的:

  string pattern = @"\[(col_\d+)\]";
  MatchCollection matches = Regex.Matches(input, pattern);
  string[] results = matches.Cast<Match>().Select(x => x.Groups[1].Value).ToArray();

用输入字符串替换输入。

我希望它有所帮助

答案 2 :(得分:1)

这有点hacky,但你可以做到这一点。

var myMessage =@"[col_5] is a central heating boiler..."; //etc.

var values = Enumerable.Range(1, 100)
             .Select(x => "[col_" + x + "]")
             .Where(x => myMessage.Contains(x))
             .ToList();

假设在这种情况下有一个已知的max col_“x”我假设为100,它只是通过强力回复它们只返回它在文本中找到的那些。

如果你知道只有这么多的专栏要搜索,我会亲自试试这个而不是Regex,因为我在Regex上浪费了太多不好的经验。