我设法找到了正则表达式,几乎得到了我想要的结果,即
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本身有一个更优雅的解决方案?
提前致谢。
答案 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
*/