这段代码
Regex regex = new Regex("blah",RegexOptions.Singleline & RegexOptions.IgnoreCase);
编译后在ILSpy中看起来像这样:
Regex regex = new Regex("blah",RegexOptions.None);
为什么会发生这种情况,并且它是正则表达式在.Net 3.5中不匹配的原因吗?在4.5它工作.
解决方法
RegexOptions.Singleline & RegexOptions.IgnoreCase
是按位AND,并解析为0(即RegexOptions.None).
RegexOptions枚举如下所示:
[Flags] public enum RegexOptions { None = 0,IgnoreCase = 1,Multiline = 2,ExplicitCapture = 4,Compiled = 8,Singleline = 16,IgnorePatternWhitespace = 32,RightToLeft = 64,ECMAScript = 256,CultureInvariant = 512,}
所以,在二进制中,我们有:
RegexOptions.SingleLine == 10000 RegexOptions.IngoreCase == 00001
当应用按位AND时,我们得到:
10000 AND 00001 ----- 00000
用…来代替
RegexOptions.Singleline | RegexOptions.IgnoreCase
这使:
10000 OR 00001 ----- 10001
ILSpy将反编译:
Regex regex = new Regex("blah",RegexOptions.Singleline | RegexOptions.IgnoreCase);
但我不知道.Net 4.5中的“有效”.我刚编译了你的代码,ILSpy也输出:
Regex regex = new Regex("blah",RegexOptions.None);
如预期.