区别ECMAScript与规范化正则表达式的行为

蝈蝈俊在它的专栏发表了篇文章,提到JavaScript的正则表达式跟.net的正则表达式的差异。原文地址在: http://blog.csdn.net/ghj1976/archive/2004/08/17/76967.aspx

在CSDN用户注册中,注册名要求符合正则表达式[a-zA-Z_0-9],因此采用/w来匹配,但是/w在JavaScript中是与[a-zA-Z_0-9]等效的,但是在服务器端的验证当中,.Net Framework的正则表达式验证中,/w的匹配并不等效于[a-zA-Z_0-9]。由于.Net Framework的正则表达式符合规范化的正则表达式,它支持Unicode字符类别,所以/w在此等效于[/p{Ll}/p{Lu}/p{Lt}/p{Lo}/p{Nd}/p{Pc}],即符合Unicode中的大小写字母(Lu,Ll)字符类、TitleCase字符类(Lt)、阿拉伯数字类(Nd)、连接符号类(Pc)和其他文字类。

事实上,这种区别不只是JavaScript正则表达式和.Net正则表达式的区别,也是EMCAScript和规范化的正则表达式的区别。 EMCAScript的正则表达式和规范化的正则表达式有三个方面的差异,这是同时使用EMCAScript正则表示式和规范化的正则表达式需要注意区分的。MSDN提供的一份参考文档中描述了这三种差异。

  • 匹配表达式中指定字符类的方式不同。默认情况下,规范化正则表达式支持 Unicode 字符类别。而ECMAScript 不支持 Unicode。
  • 自身具有后向引用的正则表达式捕获类必须在每次捕获迭代时得到更新。
  • 对八进制转义和后向引用间的多义性的处理方式不同。

在八进制与后向引用解释中的区别有一张表可以参考。

规范化正则表达式行为ECMAScript 行为
如果 / 后跟 0,再后跟 0 到 2 个八进制数字,则解释为八进制。例如,/044 始终表示 s。行为相同。
如果 / 后跟一个从 1 到 9 的数字,后面再没有任何其他十进制数字,则解释为后向引用。例如,/9 始终表示后向引用 9,即使捕获 9 不存在。如果捕获不存在,则正则表达式分析器将引发语法异常。如果存在单个十进制数字捕获,则后向引用该数字。否则解释为文本。
如果 / 后跟一个从 1 到 9 的数字,后面还有其他十进制数字,则将这些数字转换为十进制值。如果存在该捕获,则解释为后向引用。否则,解释为使用值不超过 /377 的前导八进制数字的八进制数字;将其余数字解释为文本。例如,对于 /400,如果存在捕获 400,则解释为后向引用 400;如果捕获 400 不存在,则 /400 解释为后跟 0 的八进制数字 /40。如果 / 后跟从 1 到 9 的数字,后面还有任何十进制数字,则通过将尽可能多的数字转换为可引用捕获的十进制值而解释为后向引用。如果任何数字都不能转换,则解释为使用值不超过 /377 的前导八进制数字的八进制数字;将其余数字解释为文本。

在.Net Framework的正则表达式Options比EMCAScript提供了更丰富的选择,Options可以由RegexOptions枚举访问到,其中就有开启符合EMCAScript行为的选项。通过Regex的Options属性可以设置正则表达式符合EMCAScript行为,将服务器端的正则表达式选项设置为EMCAScript,可以保证浏览器端和服务器端的验证完全一致。

蝈蝈俊在解决CSDN注册名问题时,为了保证服务器端验证正确,重新定义了匹配字符串,实际上为了保证浏览器端和服务器端的验证一致,只需要修改.Net的Regex的选项就可以了。在不需要做正则表达式的Unicode匹配的中,EMCAScript的方式足够了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值