此代码
Regex regex = new Regex("blah", RegexOptions.Singleline & RegexOptions.IgnoreCase);
编译后的在ILSpy中显示如下:
Regex regex = new Regex("blah", RegexOptions.None);
为什么会发生这种情况,并且它可能是正则表达式在.Net 3.5中不匹配的原因吗?在4.5它工作。
答案 0 :(得分:14)
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);
按预期。