posts - 297,  comments - 1618,  trackbacks - 0

     嘿嘿,本文题目取自BeanSoft的评论。
     因比较多时候接触到正则表达式,每次都google比较麻烦,所以花了点时间学习和进行总结,希望对少部分人也有点帮助。

  1.  概念及其作用

           正则表达式的英文是regular expression,正则表达式,就是用某种模式去匹配一类字符串的一个公式。
           正则表达式具有如下作用:
            1)测试字符串的某种模式。eg. 检验在某个字符串中是否存在一个电话号码和一个身份证号码;
            2)替换文本。eg. 在文本中使用一个正则表达式来标识特定文字,将其替换成其他文字;
            3)根据指定的模式从字符串中提取一个子字符串。

    2.   元字符及描述

元字符   描述


.
匹配任何单个字符。例如正则表达式r.t匹配这些字符串:ratrutr t,但是不匹配root。 
$
匹配行结束符。例如正则表达式weasel$ 能够匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."。 
^
匹配一行的开始。例如正则表达式^When in能够匹配字符串"When in the course of human events"的开始,但是不能匹配"What and When in the"。
*
匹配0或多个正好在它之前的那个字符。例如"zo*"可以匹配"z"和"zoo"等。
\
这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配。例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符。
[ ] 
[c 1 -c 2 ]
[^c 1 -c 2 ]
匹配括号中的任何一个字符。例如正则表达式r[aou]t匹配ratrotrut,但是不匹配ret。可以在括号中使用连字符-来指定字符的区间,例如正则表达式[0-9]可以匹配任何数字字符;还可以制定多个区间,例如正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是“排除”,要想匹配除了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,例如正则表达式[^269A-Z] 将匹配除了2、6、9和所有大写字母之外的任何字符。
\< \>
匹配词(word)的开始(\<)和结束(\>)。例如正则表达式\<the能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。
\( \)
将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1\9 的符号来引用。
|
将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。
+
匹配1或多个正好在它之前的那个字符。例如正则表达式9+匹配9、99、999等。注意:这个元字符不是所有的软件都支持的。
?
匹配0或1个正好在它之前的那个字符。例如,abc?能匹配abc和ab,注意:这个元字符不是所有的软件都支持的。
\{ i \}
\{ i , j \}
匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如正则表达式A[0-9]\{3\} 能够匹配字符"A"后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。而正则表达式[0-9]\{4,6\} 匹配连续的任意4个、5个或者6个数字字符。注意:这个元字符不是所有的软件都支持的。

    3.   RegExp对象的属性和方法
         1)简述
            
该对象用来完成有关正则表达式的操作和功能;每一条正则表达式模式对应一个RegExp实例,创建RegExp对象的方式如下:
             显式构造函数:new ReExp("pattern"[,"flags"]);
             隐式构造函数(此方法比较常用),采用纯文本方式:/pattern/[flags].
             其中pattern部分为要使用的正则表达式模式文本,是必须的,flags部分设置正则表达式的标志信息,为可选项。flags可以是如下标记的组合:
            g是全局标志。若设置了这个标志,对某个文本执行搜索和替换操作时,将对文本所有匹配的部分起作用,否则,则仅搜索和替换最早匹配的内容;

            i是忽略大小写标志;
            m是多行标志.
            eg.

< script language = " javascript " >
<!--
var  str  =   " I am amigo " ;
var  regex  =   new  RegExp( " amigo " );
document.write(
" regex:  "   +  regex  +   " <br> " );
if (regex.test(str))  {
    document.write(
" 找到指定字符串amigo<br> " );
}
  else   {
    document.write(
" 未找到指定字符串amigo<br> " );
}


var  regex1  =   / amigo / ;
if (regex1.test(str))  {
    document.write(
" 找到指定字符串amigo " );
}
  else   {
    document.write(
" 未找到指定字符串amigo " );
}

// -->
</ script >

         输出结果如下:
           regex: /amigo/
           找到指定字符串amigo
           找到指定字符串amigo
        注意: 由于JavaScript字符串中"\"是一个转义字符,因此显式构造函数创建RegExp实例对象时,应将原是政则表达式的"\"用"\\"替换.
        eg.

< script language = " javascript " >
<!--
    
var  regex1  =   new  RegExp( " \\d{3} " );
    
var  regex2  =   / \d { 3 } / ;
    document.write(
" regex1:  "   +  regex1  +   " <br> " );
    document.write(
" regex2:  "   +  regex2);
// -->
</ script >

       输出结果如下:
        regex1: /\d{3}/
        regex2: /\d{3}/
        由于正则表达式模式文本中的转义字符也是"\",如果正则表达式中要匹配原义字符"\",在正则表达式模式文本中要以"\\"表示,当显式的方式来表示时,要用"\\\\"来表示原义字符"\".
      2).    属性
          1) index:  当前表达式模式首次匹配内容的开始位置,从0开始计数, 初始值为-1;
          2) input:   返回当前所作用的字符串;
          3)lastIndex:   是当前表达式模式首次匹配内容中最后一个字符的下一个位置;
          4)lastMatch:   是当前表达式模式的最后一个匹配字符串;
          5)lastParen:   是当前表达式模式中最后的子匹配所匹配的子字符串;
          6)leftContext:   当前表达式模式最后一个匹配字符串左边的所有内容;
          7)rightContext:  当前表达式模式最后一个匹配字符串右边的所有内容;  
          上面所说的属性为其静态属性,下面是其实例属性:
          1) global:   返回标志g的状态;
          2) ignoreCase:   返回标志i的状态;
          3) multiLine:  返回标志m的状态;
          4) source:  返回创建RegExp对象实例时指定的表达式文本字符串.
      3)  方法
            test方法

            exe方法: 语法格式为exex(str).该方法使用创建RegExp对象实例时所指定的表达式模式对一个字符串进行搜索.
            compile方法: 语法格式为compile("pattern"[,"flags"]),该方法可以更换RegExp对象实例所使用的表达式模式,并将新的表达式编译为内部格式,从而使以后的匹配过程执行更快.
            综合举例:

< script language = " javascript " >
<!--
    
var  str  =   " 20070310amigo1121happy " ;
    
var  regex  =   / (\d { 8 } )amigo(\d { 4 } ) / gi;
    
var  attr, count  =   0 ;
    
while (attr  =  regex.exec(str))  {
        info();
    }


    
function  info()  {
        document.write(
" source:  "   +  regex.source  +   " <br> " );
        document.write(
" RegExp.index:  "   +  RegExp.index  +   " <br> " );
        document.write(
" RegExp.lastIndex:  "   +  RegExp.lastIndex  +   " <br> " );
        document.write(
" RegExp.lastParen:  "   +  RegExp.lastParen  +   " <br> " );
        document.write(
" RegExp.leftContext : "   +  RegExp.leftContext  +   " <br> " );    
        document.write(
" RegExp.rightContext ; "   +  RegExp.rightContext  +   " <br> " );
        document.write(
" attr.index:  "   +  attr.index  +   " <br> " );
        document.write(
" attr.lastIndex:  "   +  attr.lastIndex  +   " <br> " );
    }

// -->
</ script >
         输出结果如下:
          source: (\d{8})amigo(\d{4})
         RegExp.index: 0
         RegExp.lastIndex: 17
         RegExp.lastParen: 1121
         RegExp.leftContext:
         RegExp.rightContext;  happy
         attr.index: 0
         attr.lastIndex: 17
    4.   常用验证收集
         1)
匹配中文字符的正则表达式: [\u4e00-\u9fa5]

         2) 匹配双字节字符(包括汉字在内):[^\x00-\xff]

         3) 匹配空白行的正则表达式:\n\s*\r

         4) 匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />
            评注:上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

         5) 匹配首尾空白字符的正则表达式:^\s*|\s*$
            评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

         6) 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

         7) 匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
            评注:上面这个基本可以满足需求

         8) 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

         9) 匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
            评注:匹配形式如 0511-4405222 或 021-87888822

         10) 匹配腾讯QQ号:[1-9][0-9]{4,}
            评注:腾讯QQ号从10000开始

         11) 匹配中国邮政编码:[1-9]\d{5}(?!\d)       (注: 中国邮政编码为6位数字)

         12) 匹配身份证:\d{15}|\d{18}  (注: 中国的身份证为15位或18位)

         13) 匹配ip地址:\d+\.\d+\.\d+\.\d+

         14) 匹配特定数字:
            ^[1-9]\d*$    //匹配正整数
            ^-[1-9]\d*$   //匹配负整数
            ^-?[1-9]\d*$   //匹配整数
            ^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
            ^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
            ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
            ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
            ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
            ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
            ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
            评注:处理大量数据时有用,具体应用时注意修正

         15) 匹配特定字符串:
            ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
            ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
            ^ [a-z]+$  //匹配由26个英文字母的小写组成的字符串
            ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
            ^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
            评注:最基本也是最常用的一些表达式


posted on 2007-03-10 12:02 阿蜜果 阅读(2858) 评论(4)  编辑  收藏 所属分类: Javascript


FeedBack:
# re: 学好正则表达式, 输入验证不是梦(不断补充中)
2007-03-10 12:24 | ant
收藏了,持续更新哦。^_^  回复  更多评论
  
# re: 学好正则表达式, 输入验证不是梦(不断补充中)
2007-03-10 17:39 | 施伟
收藏。。。强烈支持
强烈支持Amigo的实用主义美文。。。
  回复  更多评论
  
# re: 学好正则表达式, 输入验证不是梦(不断补充中)
2007-03-11 16:25 | Tortoise
无条件的支持
  回复  更多评论
  
# re: 学好正则表达式, 输入验证不是梦(不断补充中)
2007-04-21 18:19 | yangay
你说的这些正则表达式是不是通用的,就是说适合JAVA、C等。还有就是这些表达式就直接写在JAVASCRIPT里面吧,项目也不需要引进什么JAR包吧?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

      生活将我们磨圆,是为了让我们滚得更远——“圆”来如此。
      我的作品:
      玩转Axure RP  (2015年12月出版)
      

      Power Designer系统分析与建模实战  (2015年7月出版)
      
     Struts2+Hibernate3+Spring2   (2010年5月出版)
     

留言簿(262)

随笔分类

随笔档案

文章分类

相册

关注blog

积分与排名

  • 积分 - 2285123
  • 排名 - 3

最新评论

阅读排行榜

评论排行榜