为什么 RegexOptions 在 MSIL 中被编译为 RegexOptions.None?
Why RegexOptions are compiled to RegexOptions.None in MSIL?
此代码
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
是按位与,解析为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
当应用按位与时,我们得到:
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 中的 "works" 是什么。我刚刚编译了你的代码,ILSpy 也输出:
Regex regex = new Regex("blah", RegexOptions.None);
符合预期。
此代码
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
是按位与,解析为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
当应用按位与时,我们得到:
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 中的 "works" 是什么。我刚刚编译了你的代码,ILSpy 也输出:
Regex regex = new Regex("blah", RegexOptions.None);
符合预期。