1

これは、最も使用されている正規表現関数の1つです。

Regex.IsMatch("Test text for regex test.", "(test)",
RegexOptions.IgnoreCase | RegexOptions.Multiline);

Regex.IsMatchメソッドがどのように機能するか説明できますか?つまり、ビット単位のOR RegexOptionsパラメーターをどのように処理するのですか?メソッドパラメータをどのように定義しますか?

返信ありがとうございます!

4

2 に答える 2

7

RegexOptions[Flags]属性が適用された列挙です。これにより、ビット単位の演算をさまざまな値に適用できます。

同様のことを行うこともできます。

[Flags]
enum MyOptions {
   UpperCase = 1,
   Reverse   = 2,
   Trim      = 4
}

public static void DoTransform(MyOptions options) {
    if ((options & MyOptions.UpperCase) == MyOptions.UpperCase) {
        /* Do Upper case transform */
    }
    if ((options & MyOptions.Reverse) == MyOptions.Reverse) {
        /* Do Reverse transform */
    }
    /* etc, ... */
}

DoTransform(MyOptions.UpperCase | MyOptions.Reverse);

フランクのコメントに基づいてもう少し掘り下げたところですが、[Flags]属性の有無にかかわらず、上記のコードがコンパイルされて実行されるというのは正しいことです。

[Flags]属性が何をしないかについては他にもコメントがありますが、「結果に影響を与える」以外は、誰もそれがToString()何をするのかを知らないか、説明したくないようです。私が書いたコードでは、属性を持つビットフィールドとして使用する予定の列挙を装飾している[Flags]ので、その場合は少なくともある程度自己文書化されています。そうでなければ、私は途方に暮れています。

于 2009-01-30T14:56:58.023 に答える
0

RegexOptionsは列挙型です。つまり、内部的には整数として表されます。その値は次のようになります。

// note the powers of 2
enum RegexOptions {
    IgnoreCase = 1,      MultiLine = 2,
    SomeOtherOption = 4, YetAnotherThing = 8 }

値は、2進数で表現すると、それぞれに1ビットがオンになるように設計されています。

このため、2つの値のビットごとのORを取り、結果が得られた場合、評価(result AND IgnoreCase)により、値の1つ(IgnoreCaseなど)が設定されているかどうかを判断できます。

于 2009-01-30T14:59:00.440 に答える