ソースコードの冗長性を取り除くために、繰り返されるコンポーネントを文字列変数に格納し、文字列から正規表現を作成することができます。
このようなもの:
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)+$
これは、「文字列の先頭またはBのいずれかが接頭辞として付いた1つ以上のAs」に変換されます。ここで、Bはコンマになり、Asは範囲になります。次に、範囲内で同じ手法を使用して、セルをコロンで区切ることができます。ただし、代わりに、セルの先頭の役割を果たすwhere(^|,)
を使用します。それがどうなるかわかりません。あなたはそれで働くことができますか?(xxx|:)
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"));
}
}