RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
区别ECMAScript与规范化正则表达式的行为
  • 作者:zhaozj
  • 发表时间:2020-12-23 10:55
  • 来源:未知

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

在用户注册中,注册名要求符合正则表达式[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 的前导八进制数字的八进制数字;将其余数字解释为文本。