2

Excel の範囲 (および単一のセル) を表す文字列に一致する正規表現があります。

^[A-Z]+[1-9][0-9]*(:[A-Z]+[1-9][0-9]*)?(,[A-Z]+[1-9][0-9]*(:[A-Z]+[1-9][0-9]*)?)*$

たとえば、次のような文字列に一致します。

C5:H6,J5:P6,R5:DM6,C15

パターンの冗長性を回避する方法があるかどうかを尋ねています。

C6に一致しますが、同じパターンに[A-Z]+[1-9][0-9]*も一致します。H6

同様にJ6:P6は、 と一致する同じパターンによって一致しC6:H6ます。

「このパターンに 1 回、またはカンマで区切られた場合にのみ * 回一致する」のような表現をしたい場合。

前もって感謝します!

4

4 に答える 4

1

ソースコードの冗長性を取り除くために、繰り返されるコンポーネントを文字列変数に格納し、文字列から正規表現を作成することができます。

このようなもの:

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"));
    }
}
于 2012-11-23T17:01:09.880 に答える
1

一連の範囲と単一セルには、正規表現パターンを使用します

(?!,)(?:(?:^|,)[A-Z]+(?!0)[0-9]+(?::[A-Z]+(?!0)[0-9]+)?)+

または、コンマで区切られた一連の同じ範囲 (または単一のセル) だけに一致させたい場合は、

^([A-Z]+(?!0)[0-9]+(?::[A-Z]+(?!0)[0-9]+)?)(,\1)*
于 2012-11-23T17:18:12.550 に答える
1

次のように正規表現を変更できます。

^([A-Z]+[1-9][0-9]*(:[A-Z]+[1-9][0-9]*)?(,(?!$)|$))*$

重要な変更点は、最後の部分式です。

(,(?!$)|$)

一致の最後にある場合を除いて、オプションのカンマ文字に一致します。この場合、それ以上の文字があってはなりません。これにより、ハンギング カンマで終わるシーケンスを照合できなくなります。

対応するideone のデモを次に示します。

于 2012-11-23T20:28:20.380 に答える