要删除源代码中的冗余,您可以将重复的组件存储到字符串变量中,并从字符串中构造正则表达式。
像这样的东西:
string cellname = "[A-Z]+[1-9][0-9]*";
string cellrange = cellname + "(:" + cellname + ")?";
Regex pattern = new Regex("^" + cellrange + "(," + cellrange + ")*$")
如果您询问是否有用于分隔符的二进制正则表达式运算符,即您可以编写的东西
A op B
意思是
A(BA)*
那么恐怕这种事情是不存在的。 附录:但是,您可以接近
((^|B)A)+$
这转换为“一个或多个 As 以字符串开头或 B 为前缀”。在这里,您的 B 将是逗号,您的 As 将是范围。然后,您可以在范围内使用相同的技术来用冒号分隔单元格。但是,(^|,)
您将使用(xxx|:)
where代替xxx
单元格的开头。我不确定那会是什么。你能用它吗?
附录 2
http://ideone.com/L3RNER上的解决方案 ——基于我最后的评论。
using System;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
Regex rx = new Regex("^([A-Z]+[1-9][0-9]*(:[A-Z]+[1-9][0-9]*)?($|,(?!$)))*$");
Console.WriteLine(rx.IsMatch("C5:H6"));
Console.WriteLine(rx.IsMatch("C5"));
Console.WriteLine(rx.IsMatch("C5:H6,J5:P6,R5:DM6,C15"));
Console.WriteLine(rx.IsMatch("C5:H6,J5:P6,R5:DM6,C15,"));
Console.WriteLine(rx.IsMatch("C5:H6J5:P6,R5:DM6,C15"));
Console.WriteLine(rx.IsMatch(",C5:H6:J5:P6,R5:DM6,C15"));
}
}