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 }

这些值的设计使得如果你用二进制表示它们,每个值都有一个位。

因此,如果您对两个值进行按位或运算并得到结果,您可以通过评估 (result AND IgnoreCase) 来确定是否设置了其中一个值(例如 IgnoreCase)。

于 2009-01-30T14:59:00.440 回答