为什么在MSIL中将RegexOptions编译为RegexOptions.None

本文关键字:RegexOptions 编译 None 中将 MSIL 为什么 | 更新日期: 2023-09-27 18:19:52

此代码

  Regex regex = new Regex("blah", RegexOptions.Singleline & RegexOptions.IgnoreCase);

编译后在ILSpy:中显示如下

  Regex regex = new Regex("blah", RegexOptions.None);

为什么会发生这种情况,这可能是正则表达式在.Net 3.5中不匹配的原因吗?在4.5上,它起作用。

为什么在MSIL中将RegexOptions编译为RegexOptions.None

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);

如预期。