加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么在MSIL中将RegexOptions编译为RegexOptions.None?

发布时间:2020-12-15 17:40:49 所属栏目:百科 来源:网络整理
导读:这段代码 Regex regex = new Regex("blah",RegexOptions.Singleline RegexOptions.IgnoreCase); 编译后在ILSpy中看起来像这样: Regex regex = new Regex("blah",RegexOptions.None); 为什么会发生这种情况,并且它是正则表达式在.Net 3.5中不匹配的原因吗?
这段代码
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);

如预期.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读