为什么在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上,它起作用。
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);
如预期。