[正则表达式高级用法]CompileToAssembly

KissXYL 2010-05-10 10:34:10
我尽可能的减少代码以突出重点,介绍一个Regex的功能,虽然实际上并没感觉这样有什么实际意义,但既然微软辛苦做了,好歹也就说明一下,抛砖引玉,过客、如梦、思归(这名字,咋听的这么暧昧呢,有点像“死鬼”,请模仿mm挑逗口气)、伴水等各位朋友给解释一下,实际哪能用的上这个?


//先定义一个RegexCompilationInfo数组,包含了正则表达式,表达式的匹配模式,表达式名称(实际就是生成的函数名),最后一个参数相当的废物哇,居然是否公开,不公开咋用啊,虽然反射无所谓的。
RegexCompilationInfo[] rcis =
{
new RegexCompilationInfo(@"^\d+$", RegexOptions.None, "Integer", "MyRegex", true),
new RegexCompilationInfo(@"^(?!0\d.+$)\d+(\.\d+)?$", RegexOptions.None, "Number", "MyRegex", true)
};
//随便定一个名字把,这个名字就是你的命名空间名字,也是你最终生成的dll文件名
AssemblyName name = new AssemblyName("MyRegex");
//妥了,用上面2个变量可以编译了。
Regex.CompileToAssembly(rcis, name);//er...就这么简单,实际上到这里,就结束了,下面是调用方法

//反射调用把,避免添加引用无法文字描述影响大家理解
//装载这个刚生成的dll
Assembly assembly = Assembly.LoadFrom(name.Name+".dll");
//我们既然是演示,就用定死的名字好了。
Type t = assembly.GetType("MyRegex.Number");
//动态创建一个实例
object obj = Activator.CreateInstance(t);
//注意这一句,汗一个,直接类型转换成Regex是可以的说明动态创建了2个类,都继承自Regex
Regex regExp = obj as Regex;
//接下来容易了,既然能转换成Regex,就直接当Regex对象来用了。
MessageBox.Show(regExp.IsMatch("123").ToString());



实现是实现了,但具体哪能用的上呢?微软不会是拍脑袋拍出来的功能吧。欢迎讨论。
...全文
595 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
njw1028 2010-05-10
  • 打赏
  • 举报
回复
正则表达式一直是我心中的痛。。学习了
Tanhualin 2010-05-10
  • 打赏
  • 举报
回复
路过拿分……
Peter200694013 2010-05-10
  • 打赏
  • 举报
回复
mark
-过客- 2010-05-10
  • 打赏
  • 举报
回复 1
.NET中提供的Regex类的一些方法和属性并不是都很有实用价值的,有些方法和属性,我只是见过,但很少使用,或是从来都没使用过

Regex.CompileToAssembly 属于我从来没有使用过的一类,但这并不代表它没用,只能说我没有遇到适合使用它的场景罢了,这主要是因为我自己的工作不涉及到写代码,自然也用不到正则

我认为Regex.CompileToAssembly的作用或是优点,大致可以归结为两点吧:
1、构建正则库,方便复用
2、提升效率

项目中如果遇到复用度比较高的正则,就可以封装到Assembly里,方便其它程序调用,而且在.NET平台上与所使用的语言无关
当然,如果仅仅是这样一个作用,那写到一个公共的类里,效果也差不了多少,这并不是构成使用它的主要原因
使用Regex.CompileToAssembly的主要原因就是效率

我们知道,在程序中创建一个Regex对象,当程序运行时,首次遇到正则表达式,首先要进行的就是检查它的语法,然后进行编译,这时需要加载正则引擎,占用内存和时间,这样得到的只是适合正则引擎使用的一种形式,匹配速度并不快
.NET中提供了RegexOptions.Compiled参数,可以在首次遇到正则表达式时,将它编译成MSIL代码,获取更高的匹配效率,当然,这样做的代价就是编译的进间更长,占用的内存更多,所以它适用于对复杂正则频繁调用或是处理大量文本的场景,复杂正则指多较多的分支结构,或是多个量词的情况,对于Regex(@"\d+")这样简单的正则,就完全没有必要用RegexOptions.Compiled参数了
而使用RegexOptions.Compiled参数的一个缺点就是,每次程序运行时都要牺牲较多的时间进行编辑,还要占用较多的内存,以换取较快的匹配速度,而Regex.CompileToAssembly则不存在这样的问题,它在生成Assembly时就已经执行了编译操作,只需要在程序中添加引用,就可以直接使用了,在程序运行时,遇到Assembly中的正则,不需要编译,也不需要浪费更多的时间和内存,又可以获得更好的匹配效率

对于那些简单的正则,或是对效率没有要求的场合,静态方法是一个很不错的选择,完全没必要用到RegexOptions.Compiled或Regex.CompileToAssembly,但对于多语言开发,或正则复用度高,或需要频繁调用正则,而又对效率要求较高的项目,Regex.CompileToAssembly是一个不错的选择

是否有用,看你的实际需求了
tonygood888 2010-05-10
  • 打赏
  • 举报
回复
不错~~
jzj083271930 2010-05-10
  • 打赏
  • 举报
回复
我也帮你顶下!
q107770540 2010-05-10
  • 打赏
  • 举报
回复
mark jf
chichenzhe 2010-05-10
  • 打赏
  • 举报
回复
复制走了.嘿嘿
传说中的张 2010-05-10
  • 打赏
  • 举报
回复
mark
jiangshun 2010-05-10
  • 打赏
  • 举报
回复
关注..
singincloud 2010-05-10
  • 打赏
  • 举报
回复
路过拿分……
liji2009 2010-05-10
  • 打赏
  • 举报
回复
帮顶。。。。。
  • 打赏
  • 举报
回复
mark
KissXYL 2010-05-10
  • 打赏
  • 举报
回复
up
夜里1点左右结贴
leafold 2010-05-10
  • 打赏
  • 举报
回复
适合在配置工具中使用。
wuyi8808 2010-05-10
  • 打赏
  • 举报
回复
没搞明白有多大的用处。
KissXYL 2010-05-10
  • 打赏
  • 举报
回复
顶一下
草帽精神 2010-05-10
  • 打赏
  • 举报
回复
mark
whowhen21 2010-05-10
  • 打赏
  • 举报
回复
这篇帖子NB,标题是蓝色的呢...
王集鹄 2010-05-10
  • 打赏
  • 举报
回复
没用过,蹭分。

感觉作用真不大,编译出来的dll比本身正则表达式字符串还占空间
加载更多回复(12)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧