这是最常用的Regex函数之一
Regex.IsMatch("Test text for regex test.", "(test)",
RegexOptions.IgnoreCase | RegexOptions.Multiline);
你能解释一下Regex.IsMatch方法是如何工作的吗? 我的意思是它如何处理按位OR RegexOptions参数? 它如何定义方法参数?
感谢您的回复!
答案 0 :(得分: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);
我刚刚根据Frank的评论进行了更多的挖掘,他是正确的,无论有没有[Flags]
属性,上面的代码都会编译并运行。
关于[Flags]
属性不所做的事情还有其他评论,但除了“它影响ToString()
结果”之外没有人似乎知道或想要解释做什么做什么。在我编写的代码中,我装饰了我打算用作具有[Flags]
属性的位域的枚举,因此在这种情况下它至少在某种程度上是自我记录的。否则,我不知所措。
答案 1 :(得分:0)
RegexOptions是一个枚举,意思是在内部,它表示为整数。它的值看起来像这样:
// note the powers of 2
enum RegexOptions {
IgnoreCase = 1, MultiLine = 2,
SomeOtherOption = 4, YetAnotherThing = 8 }
这些值的设计使得如果用二进制表示它们,每个值都有一个位。
因此,如果你采用两个值的按位OR并以结果结束,你可以通过评估(结果AND IgnoreCase)来确定是否设置了其中一个值(例如IgnoreCase)。