正则表达式匹配2个括号内的子字符串,例如[我想要这个文字]但是没有括号?

时间:2009-01-27 13:11:40

标签: c# .net regex

我设法找到了正则表达式,几乎得到了我想要的结果,即

Regex r1 = new Regex(@"\[(.*?)\]");
string row = HEADERNAMES[COL1,COL2,COL3,COL4];
Match match = r1.Match(row);
string result = match.ToString();

输出:“[COL1,COL2,COL3,COL4]”;

我知道我可以使用:

result.Replace("[", "");
result.Replace("]", "");

得到我想要的但我想知道是否有办法在不执行String方法的情况下从Regex结果中省略delimeters [和]。

我原以为使用Regex本身有一个更优雅的解决方案?

提前致谢。

3 个答案:

答案 0 :(得分:10)

Regex r1 = new Regex(@"\[(.+)\]");
string row = "HEADERNAMES[COL1, COL2, COL3, COL4]";
// Regex puts capture groups (i.e. things captured between ( and ) ) 
// in Groups collection
string match = r1.Match(row).Groups[1].Value;
//match = "COL1, COL2, COL3, COL4"

答案 1 :(得分:1)

在“Aku”提出的解决方案中有一个重要的观点(我还没有代表发表评论)

您应该注意,Groups集合中的第二项提供了您需要的值。第一项(Groups(0))相当于整个匹配的字符串(Match.ToString()或Match.Value)

答案 2 :(得分:0)

另一种方法,虽然我觉得它比aku的例子慢一点:

        Regex r1 = new Regex(@"(?<=\[).*(?=\])");
        string row = "HEADERNAMES[COL1, COL2, COL3, COL4]";
        Match match = r1.Match(row);
        Console.WriteLine(match.ToString());

        /* Output:
        COL1, COL2, COL3, COL4
        */

我不知道,但我怀疑你可能会在列名之后,并且即将对你的结果字符串执行.Split。您是否知道可以使用单个正则表达式单独获取所有列名称?

        Regex r1 = new Regex(@"\[(?:(?<colName>[^,\]]*)(?:,\s)?)*\]");
        string row = "HEADERNAMES[COL1, COL2, COL3, COL4]";
        Match match = r1.Match(row);

        foreach(Capture c in match.Groups["colName"].Captures)
            Console.WriteLine(c.ToString());

        /* Output:
        COL1
        COL2
        COL3
        COL4
        */