正则表达式

 正则表达式

正则表达式可以做什么?

     1.测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式,这称为数据有效性验证 。

     2.替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。

     3.根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字 

     4 正则表达式看上去并不像某种语言或者某个技术那么重要,仅靠它们你无法写出一个应用程序来。然而,它们却总是在你的开发过程中如影随形,

     不管是进行表单验证,还是高亮显示搜索结果,或者是进行URL地址映射,都是非常有用的。

  总共可以分为以下几大模块:

   1.匹配单个字符

   2.匹配多个字符

   3.匹配边界

   4.匹配子模式

   5.后向引用

   6.文本替换

   7.预查和非获取匹配

  正则表示在多种开发语言(c#,javascript等)中都有应用,我主要用javascript作为例子学习和总结。

  通常情况下, 如果一个文本中出现了多个匹配, 正则表达式返回第一个匹配, 如果将 global设置为 true, 则会返回全部匹配;

  匹配模式是大小写敏感的,如果设置了 ignore case 为 true 则忽略大小写。

 

 在js中使用正则表达是,主要通过两种方法 

一:通过RegExp对象,他有三个方法 test() exec() compile()

   1.test() 方法检索字符串中的指定值。返回值是 true 或 false。

   2.exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。

   3.compile() 方法用于改变 RegExp。

   具体实例:

<script type="text/javascript">
   //RegExp 直接量语法 就是两个斜杠 /表达式/
   //var reg=new RegExp('I') 等价于 /I/
   //test  的用法
   function showTest(){
        var text='I love china';
        var patt=new RegExp('I');
        var isTrue=patt.test(text);  //只要有一个I存在就返回true ,否则false
   }
   //exec 的用法
   function showExec(){
        var text='I love china';
        var patt=new RegExp('I');
        var result=patt.exec(text);  //返回 I
        
        
   }
   //全局 大小写 设置
   function showGI(){
       var text='I love china I love american I love world';
        var re='';
        var patt=new RegExp('I','g');
        do{
         re=patt.exec(text);
         alert(re)
        }while(re!=null)
        //如果加上i 就不区分大小了
        var patt=new RegExp('I','gi');
   }
   //compile 的用法
   function showCompile(){
        var text='I love china'
        var patt=new RegExp('I');
        var isTrue=patt.test(text);  //true
        patt.compile('x');
        var isTrue=patt.test(text);  //false
    
   }

二:字符串的match 和replace 方法

   function showMatch(){
      var str='I love you!';
      var reg1=str.match('you');  //you
      var reg2=str.match('you!'); //you!
   }
   function showMatch2(){
      var str='I love you you you you....';
      var reg=/you/g;
      var reg1=str.match(reg); //它会将所有的you都以数组的形式存储
      //这个是与exec 最大的区别
   }

function showReplace(){
      var str='I love you you you you....';
      var reg=/you/;
      var reg1=str.replace(reg,'me'); 
      //结果:I love me you you you...."
      //如果要替换所有的 you 
      //那么就要加上:g
      //var reg=/you/g;
    
   }

  1.匹配单个字符

   function reg(){
    //1.匹配固定单个字符 i
    //2.匹配任意单个字符 .  
    //3.匹配“.”元字符 \.
    //4.匹配字符组   [en]
    //5 在字符组中使用字符区间  [a-z]
    //6 反义字符组 [^en]
    //7 匹配元字符,要使用“\”来进行转义
    //8 匹配空字符 
    /*
\r 回车 \n 换行 \t Tab 键 \d 所有单个数字,与 [0-9] 相同 \D 所有非数字, 与 [^0-9] 相同 \w 所有单个大小写字母、数字、下划线,与 [ a-zA-Z0-9_ ] 相同 \W 所有单个非大小写字母、非数字、非下划线,与 [^ a-zA-Z0-9_ ] 相同 \s 所有单个空字符,与 [\f\n\r\t\v] 相同 \S 所有单个非空字符,与 [^\f\n\r\t\v] 相同 */ }

  2.匹配多个字符

     正则表达式中,可以在 单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型,(比如“\d”)、单个任意字符(即“.”) 后面加“+” ,来表示匹配一个或多个(换言之,至少一个)字符组成的字符串。

function reg2(){
     /*
        1.匹配一个或多个         i+  一个或者多个i
        2.匹配零个或多个字符      i*  0个或者多个i
        3.匹配零个或一个字符串    i?  0个或者一个字符
        4.匹配指定数目字符        i{3} 匹配三个i
        5.匹配区间以内数目的字符   i{1,3} 最少一个i 最多3个i
     */   
       
   }

 贪婪匹配和惰性匹配

贪婪匹配(greedy):它会匹配尽可能多的字符。

惰性匹配(lazy):     它会匹配尽可能少的字符,它从第一个字符开始找起,一旦符合条件,立刻保存到匹配集合中,然后继续进行查找。所以说它是懒惰的。

   

    举例说明:

function reg3(){
       var txt='I LOVE <strong>ME</strong> AND <strong>YOU</strong> !';
       //现在我们要匹配 <strong></strong>  之间的内容;
       var greedy=/<strong>.*<\/strong>/g  
       var lazy= /<strong>.*?<\/strong>/g
       
       var re=txt.match(greedy);
       var re1=txt.match(lazy);
      
   }

结果:

 

注意:

一个是“{n}”,对于这种形式的匹配,由于它精确地要求匹配 n 个字符,所以无所谓贪婪还是惰性,尽管“{n}?”也是正确的匹配写法,

但它的匹配结果总是与“{n}”相同。

还有一个就是“??”

3.匹配边界

 则表达式中,可以在 字符 前加“\b”,来匹配其 后面 的字符位于字符串首位的字符

   function reg4(){
     //a 开头的单词,换句话说a不能在中间,或者结尾处
     var txt='good nice awesome gain';
     var reg=/\ba/g;
     var result=txt.match(reg);
       
   }
   function reg5(){     
     //匹配单词 old
     var txt ='the old man wear a gold watch' 
     var reg=/\bold/g;
     var result=txt.match(reg);
     //正则表达式中,可以在 字符 后加“\b”,来匹配其 前面 的字符位于字符串末位的字符
   }

边界及其相对性

    通常情况下,以 空格、段落首行、段落末尾、逗号、句号 等符号作为边界,值得注意的是,分隔符“-”也可以作为边界

 function reg7(){
       var txt='aaaa,bbbb';   
       var txt1='aaa-,-bbb';
       var reg=/\b,\b/g
       var re=txt.match(reg);  //,
       var re1=txt1.match(reg); //null
   }

 有了“\b”,自然有“\B”,它用来匹配不在边界的字符,匹配非单词边界

匹配文本首

在正则表达式中,可以在 匹配模式的第一个字符前添加 “^”,以匹配 满足模式且位于全部文本之首的字符串

在正则表达式中,可以在 匹配模式的最后一个字符后添加 “$”,以匹配 满足模式且位于全部文本之末的字符串。

4.匹配子模式

1.在正则表达式中,可以使用“(”和“)”将模式中的子字符串括起来,以形成一个子模式,将子模式视为一个整体时,那么它就相当于一个单个字符。
2.在正则表达式中,可以使用“|”将一个表达式拆分成两部分“reg1|reg2”,它的意思是:匹配所有符合表达式 reg1 的文本 或者 符合表达式 reg2 的文本。

3.用子模式的一个作用:系统会在幕后将所有的子模式保存起来,以供后向引用使用(包含查找时的后向引用 和 替换时的后向引用)

    function reg8(){
      //我们想要匹配 “1900”到“2099”的所有年份
      txt='1890 1991 2008 2990'    ;
      var reg=/(19|20)\d{2}/g //较为综合的一个应用
    }


5.后向引用

1.正则表达式中,使用“\数字”来进行后向引用,数字表示这里引用的是前面的第几个子模式。

 function reg8(){
    var txt='let us go go!';
    var reg=/(go) \1/g;
    var result=txt.match(reg); 
  }
  
  //匹配重复单词
  function reg9(){
      var reg=/(\w+) \1/g;
  }
  //匹配有效的 HTML 
  function reg10(){
      var reg=/<h([1-6])>.*?<\/h\1>/g;
        
  }

.Net 中的后向引用

     在 .Net 中使用正则表达式进行查找时,给子模式命名的语法是:?<name>,后向引用的语法是:\k<name>。

6.文本替换

正则表达式的三部曲应该是:1、查找;2、引用匹配了的文本(后向引用);3、有选择地替换文本。

需要注意的是:大部分语言的正则表达式实现,在查找中,使用后向引用来代表一个子模式,其语法是“\数字”;而在替换中,其语法是“$数字”。

 function reg11(){
    var txt='<h1>This is a valid header</h1>';
    var reg=/<h1>(.*?)<\/h1>/g;
    var repalce='<h1 style="background:#ff0">$1</h1>'
    var result=txt.replace(reg,repalce); 
    //结果:
    //"<h1 style="background:#ff0">This is a valid header</h1>" 
    
  }
  //替换电话号码
  //格式都改为:029-8401132
  function reg12(){
     var txt='(020)82514769 (021)83281314 (029)88401132';  
     var reg=/\((\d{3})\)(\d{8})/g;
     var replaceReg='$1-$2';
     var result=txt.replace(reg,replaceReg);
     //结果:
     //020-82514769 021-83281314 029-88401132
  }

.Net 中的文本替换

    在 .Net 中使用正则表达式进行替换时,给子模式命名的语法是:?<name>,后向引用的语法是:${name}

7.预查和非获取匹配

        1.用子模式的一个作用:系统会在幕后将所有的子模式保存起来,以供后向引用使用(包含查找时的后向引用 和 替换时的后向引用)

        2.而很多时候,我们添加一个子模式,并不是为了在后向引用中获取它,我们或许是出于匹配需要,或许简单的只是为了使表达式更清晰,
         正则表达式中,可以在子模式内部前面加“?:”来表示这个子模式是一个 非获取匹配,非获取匹配不会被保存,不能在后向引用中获取。

        3. 正则表达式中,可以在子模式内部前面加“?:”来表示这个子模式是一个 非获取匹配,非 获取匹配不会被保存,不能在后向引用中获取。

function reg13(){
       var txt='window 98 window2000xp window 2008'
       var reg=/window (?:[\w.]+\b)/g;
       var replaceReg='Win$1';
       var result=txt.replace(reg,replaceReg);
       //结果:
       //Win$1 window2000xp Win$1
       //“$1”被当作一个普通字符进行了处理
   }

正向预查

它的语法是在 子模式内部 前面加“?=”,表示的意思是:首先,要匹配的文本必须满足此子模式它的语法是在 子模式内部 前面加“?=”,表示的意思是:
首先要满足整个表达式,然后提出满足子模式的部分。剩下的才是我们想要的

   function reg14(){
      // 满足真模式滴,然后踢出满足子模式滴部分
       var txt='windows 98 windows 2000xp windows 2008 windows3000'
       var reg=/windows (?=[\w.]+\b)/g;
       var result=txt.replace(reg,'MC');
       
       //结果:MC98 MC2000xp MC2008 windows3000
       
   }

反向预查 

    反向预查 的语法是在子模式内部前面加“?<=”,表示的意思是:首先,要匹配的文本必须满足此子模式  后面  的表达式其次,此子模式不参与匹配

 

   由于js中不支持反向预查,此处就不举例了!

        

正向、反向预查组合

 

负正向预查、负反向预查

一个html编码代码

function HTMLEncode(input) {
            var convert = document.createElement("DIV");
            convert.innerText = input;
            var output = convert.innerHTML;
            convert = null;
            return output;
        }

  总结:本小节,只是对正则表达式的基本语法做一些讲解,具体的实例总结,亲看第二篇;

   参考文献:

  张子阳的:http://www.tracefact.net/Misc/Regular-Expression-Tutorial.aspx(他讲得非常详细了)

 

posted @ 2015-10-09 14:54  咕-咚  阅读(329)  评论(0)    收藏  举报