2007年1月20日星期六

现学现卖之正则表达式

前几日收到客户提交的一个Bug涉及到了正则表达式的使用,于是就赶紧从Google恶补了一次.
这个Bug的大概情况是这样的:
这是一个用ASP.NET 2.0实现的Web项目,用到了ASP.NET AJAX框架.在一个页面中有一个文本框用于输入浮点型数值, 为了做到只允许输入数字和小数点我采用了ASP.NET AJAX Control Toolkit中的一个extender: FilteredTextBox,另外为了保证输入的数据是合法的浮点型数据我在Javascript中用正则表达式来验证输入的内容.当时对正则表达式的语法也不了解只是从别的地方抄来了一个表达式:/^\d+(\.\d+)?$/反正能用.
但客户提出了这样的问题:输入0.123没有问题但输入.123就提示格式不合法.客户要求输入.123和输入0.123都是允许的.
我现把解决后的表达式写出来然后在说说我所学到的一点正则表达式的知识, 很简单,修改后的表达式是:/^\d*(\.\d+)?$/只有一个字符之差!

我主要是看了这篇文章和竹笋炒肉的一篇文章才对正则表达式有了一个初步的认识.下面是我对表达式/^\d+(\.\d+)?$/的一些理解:
这个表达式一共包含15个字符,我按照每个字符分别进行了说明

  • 第一个字符:/ 和最后一个字符组成一对分隔符,之间放入表达式模式的各种组件来构造一个正则表达式.
  • 第二个字符:^ 它是一个定位符,用来匹配输入字符串的开始位置.
  • 第三个字符:\ 它是一个转义符,将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符.
  • 第四个字符:d 它和前面的转义符一起用来匹配一个数字字符,在本例子中再配合第二个定位符^就可以用来匹配数字开头的字符串,比如012abc, 2.abc等.
  • 第五个字符:+ 它是一个限定符用来指定其前面的子表达式出现一次或多次才能满足匹配.在本例中配合前面的^\d就可以用来匹配用数字开头的字符串并且开头的数字至少要有一个,还句话说就是必须用数字开头的字符串.另外在修改后的表达式中把这个位置的字符换成了*, *也是一个限定符,它用来表示其前面的子表达式出现零次或多次才能满足匹配.于是修改后可以用来匹配开头是数字或不是数字的字符串.
  • 第六个字符:( 用来标记一个子表达式的开始.
  • 第七个字符:\ 这是一个转义符.
  • 第八个字符:. 配合前面的转义符就代表小数点本身,如果没有前面的转义符则用来匹配除换行符 \n之外的任何单字符.
  • 第九个字符:\ 还是个转义符.
  • 第十个字符:d 第四个字符一样,配合前面的转义符用来匹配一个数字字符.
  • 第十一个字符:+ 和第五个字符一样,表示前面的数字字符至少出现一次或多次.
  • 第十二个字符:) 用来标记一个子表达式的结束.
  • 第十三个字符:? 它是一个限定符用来匹配前面的子表达式零次或一次, 结合前面的子表达式就保证只匹配包含一个小数点的字符串,并且可以直接用小数点开头.
  • 第十四个字符:$ 它是一个定位符, 用来规定匹配模式必须出现在目标对象的结尾, 在本例中就表示只有结尾是数字字符的字符串才会被匹配.
  • 第十五个字符:/ 和第一个字符组成一对分隔符.
所有的字符已经介绍完毕,最终这个正则表达式就达到了只匹配浮点数,并且如果有小数点则其前面的数字可有可无但其后必须有数字.

0 comments: