00学习笔记-正则表达式

第一章、      概述

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

-      正则表达式简写为regex、regexp、RE

-      正则表达式常用于字符串操作,以及表单的输入验证

-      正则表达式是用某种模式去匹配一类字符串的公式,是一种强大的字符串匹配工具

-      正则表达式可以理解为生产流水线上一种标准的格式规范,作为一个标准的模具,当需要被验证的字符串符合这种格式规范就会通过检验,不符合则被过滤掉

第二章、      格式

正则表达式的定义有两种: 显式定义、隐式定义

        显式定义:

                 使用new关键字来定义,其中的正则表达式必须使用引号包裹,还要注意字符串的转义。

           语法:  var 变量名 =  new RegExp( “ 正则表达式 ” );

           var 变量名 =  new RegExp( “ 正则表达式 ”,“选项” );

                      例:   var re = new RegExp( “[a-z]” ,”i” );

        隐式定义:

                不需要new和引号,只需要在表达式前后都加 /

           语法:   var 变量名 = / 正则表达式 /

            var 变量名 = / 正则表达式 /选项

           例:  var re = /[a-z]/i;

      *---------------------------------------*

        选项(可选):

               i : 忽略大小写

               g : 全局匹配

          gi: 既全局匹配,又忽略大小写

      *---------------------------------------*

** 在JS中,正则表达式是由一个RegExp对象表示的,利用RegExp对象来完成有关正则表达式的操作和功能

第三章、      正则匹配验证

  re.test(str);      //用于判断某字符串str是否匹配需要的正则表达式re模式

    语法:正则表达式 . test( 字符串 )

                如果符合,返回true ;否则返回false

    例:    

1 var oRe = /\d{6}/;
2 var oStr0 = '666666';
3 var oStr1 = '332od';
4 alert(oRe.test(oStr0)); //返回true 5 alert(oRe.test(oStr1)); //返回false

第四章、      匹配规则

a)普通字符

  单个出现,前面没有转义符号的的a~z、0~9

  普通字符的出现,就意味着待验证的字符串的相同位置必须有相同的普通字符

  例:/h[123456]/   表示h1~h6

b)      元字符

  *** 在元字符中,字母大写表示非

    比如:\d表示匹配数字, \D表示匹配非数字

1 \d      //匹配数字,相当于[0-9]
2 \D      //匹配非数字,相当于[^0-9]
3 \w      //匹配字母/数字/汉字/下划线
4 \W      //匹配非(字母/数字/汉字/下划线)的字符
5 \s      //匹配空白符,包括(空格/换行符/制表符tab)
6 \S      //匹配非空白符
7 .       //匹配除了换行符以外的字符
8 [ ]     //匹配符合方括号里面条件的字符
9 [^ ]    //匹配不符合方括号里面条件的字符

** []拓展:

  在正则中,[ ] 表示匹配方括号中的任意一个字符就算匹配成功,也可以说,[]就代表一个字符,这个字符符合[]里任一的条件就可

  1. [abc]

    表示或者:即此处出现并且只出现abc中的一个,只使用其中一个字符,在这里边不需要空格或,等间隔符号

    例:  / A[abc]B / : 等价于/A(a|b|c)B/,也等价于/ AaB|AbB|AcB /

  2. [0-9] / [a-z] / [0-9a-z]

    范围:代表从0到9每一个数字相当于\d / 从a到z的每一个字母 /  所有数字/字母

    ** []只表示取值范围,取值个数只有一个

    **需要注意的是[]里面不管有多少规则,但是在匹配字符串的时候,[]规则对应的只是响应位置上的一位字符的匹配

    例:[0-9] 代表数字0到9中的一个

  3. [ ^ ]

    非 : 除了,

    要注意的是,一个[^]是一个整体,代表一个字符,也就是

    [ ^abc ] : 意为[ ^a ]、[ ^b ]、[ ^c ],这个字符不能是a,也不能是b,也不能是c

    一定不要认为[^ab]等于[^a]或[b],这个是错误的

         应用:小说采集器—自定义innerText方法去掉标签,将HTML变成文本             

oBtn.onclick = function (){
        var re = /<[^<>]+>/g;
       oTxt2.value = oTxt1.value.replace(re,' ');
}    

     

 *** 在这里一定要有[ ^<> ],这是为了避免由于第一个<和最后一个>导致所有东西都清空,也就是避免<>里面嵌套着标签

c)      连接符

  -作为连接符来表示一种范围

1 [0-9]            //匹配数字,相当于/d
2 [a-z]            //匹配小写字母
3 [A-Z]            //匹配大写字母
4 [0-9a-zA-Z]     //匹配数字或英文字母    

d)      限定符/量词

限定某个或某一类字符出现的次数,当表示一类字符的重复次数的时候,字符之间是连续的,不能被其他字符隔开

1 +       //a+     表示+前一个字符a必须出现至少一次才算匹配成功     (1~)次
2 *     //a*     表示*前一个字符*出不出现,出现多少次都行       (0~)次
3 ?     //a?     表示a可以出现,也可以不出现,但出现最多出现一次   (0~1)次
4 {n}    //a{n}   a必须出现n次                     (n)次
5 {n,}   //a{n,}   a至少出现n次                     (n~)次
6 {,m}   //a{,m}   a最多出现m次                     (~m)次
7 {n,m}   //a{n,m}  a至少出现n次,最多m次                (n~m)次

 例:

  匹配qq号: /1-9\d{5,10}/ ,表示查找一串字符,第一位是1到9中的一个数字,后面跟着5到10个数字

 ** 要注意的是:限定符限定的字符是连续的,

  即 go{2} 可以匹配goo,但不能匹配goao

e)      定位符

定位符用于限定某些字符出现的位置

正则表达式的匹配规则是,只要有一部分符合就算匹配成功,也就是说我们要匹配一段字符串,这个时候开头和结尾如果多了其他的字符也算匹配成功,所以这时候就用到限定行首行尾,一般用于校验以及去首尾空格的情况

正确的语法是:  /^a正则$b/   这个正则表达式,开头必须是a,结尾必须是b

1 ^    /*  /^abc/ 限定开始的字符必须是abc,也就是整个表达式规则对应的字符串部分必须在待验证字符串的开头  */
2 $    /*  /abc$/ 限定结尾的字符必须是abc,也就是整个表达式规则对应的字符串部分必须在待验证字符串的末尾  */
3 \b   /*  \b代表这里有一个单词边界   */
4 \B   /*  \B代表这里不是单词边界   */

**  ^在[]中代表非,在外面就是代表行首

举例:

对于^,  /^abc/可以通过的是:abcd,但是dabc是不可以的

对于$,  /abc$/可以通过的是:dabc,但是abcd是不可以的

**关于\b和\B

这两个定位符主要用于英文,最常用的就是通过/\b...\b/来匹配一个英文单词

*-*单词边界:

  所谓的单词边界是单词字母和单词分隔符(一般指空白符)中间位置,也就是说单词边界就代表单词字母和空白符相邻

比如:hello world,我们使用!代表单词边界来看就是:hello! !world

所以:对于:acb cab bac 来说

   /c\b/ 可以匹配到 bac

  /\bc/ 可以匹配到cab

  /\b[a-z]c[a-z]\b/ 可以匹配到acb

  /\Bc/和/c\B/都可以匹配到acb,因为在单词内部,c的两边都不是边界

f)       转义字符

对于特殊字符:$  (   )   *   +  .   [  ]  ?  /  ^  {  }  |  在正则表达式中都有特殊的含义,如果想要将他作为原有含义使用,那么都需要进行转义,转义方法为在前面加一个\

如果要转义的特殊字符是\,那么久使用\\

例如:go+中的+代表重复、go\+中经过转义后的+代表就是单纯的+

**特殊的,我们知道定义一个正则的语法是//包裹

var abc = / \d{6} /;

使用另一种写法为:

var abc = new RegExp(“\\d{6}”);

** 会发现这里使用的是\\而不是\

其实使用new关键字定义正则表达式,RegExp对象是一个字符串,因此这里必须使用JavaScript的转义字符(不同于正则表达式转义字符)

g)      分组符

  使用()将某部分字符作为一个整体进行操作

  对于/[abc]{2}意思是匹配含有abc中任意两个字符组合的字符串

  对于/(abc){2}意思是匹配含有abcabc的字符串

h)      选择符

  常和分组符配套使用

  ab|cd 这样是匹配ab或者cd,
  而a(b|c)d匹配的abd或者acd

第五章、      与字符串相结合

a)      由字符串操作引入

  1.str.search(Str);查找

    返回一个数字,这个数字是目标字符串第一次出现的位置

    如果字符串不包含目标字符串,就返回-1

  2.str.substring(m);剪切

    返回从m一直到最后一个字符的一段字符串

    str.substring(m,n);剪切

    返回从m到n-1的一段字符串

  3.str.charAt(m);

    返回第m位的字符

  4.str.split(Str);

    将目标字符串以Str为分隔符切开塞入数组并返回数组

b)      将字符串操作与正则结合

    a)      str.search(Str);       

      //该方法不只可以查找字符串,同时可以查找正则表达式

    例:

      var re = /\d/;

      str.search(re);

      **应用:

      window.navigator.userAgent       这句话的意思是当前浏览器的种类和版本,里面杂乱的东西很多

       

      这个时候可以通过userAgent配合正则来获取并判断浏览器的类型

b)      str.match()

    //匹配

    **  挑出所有数字

     例: var Str = /\d+/g;

       alert(str.match(Str));

c)      str.replace()    

    //替换、过滤

    str.replace( ‘a’ , ‘T’);            //这句话本意是说将a都替换为T,但是这个是有问题的,如果str中的a不止一个,结果被替换的却只有第一个

    解决:

    str.replace(/a/g , ‘T’);

    ** 如果我们忽略大小写,将所有的a/A改为T,那么str.replace(/a/gi , ‘T’);或者str.replace(/a/ig , ‘T’);都可以。

  简单实例:敏感词过滤:    

1 oBtn.onclick = function (){
2    var re = /你丫的|你妹的|你大爷的/g;
3    oTxt2.value = oTxt1.value.replace(re,"***");          
4 }

第六章、      相关应用

a)      匹配HTML标签

  <[a~zA~Z][^>]*>

b)      匹配windows系统的名称

  Windows\s*((95)|(98)|(2000)|(ME)|(XP)|(7)|(8)|(10)) 

d)      校验邮箱

 

最终:/^ \w+@[a-z0-9]+\.[a-z]{2,4} $/

e)      去首尾空格

  /^\s+/   去掉行首的空格

  /\s+$/   去掉行尾的空格

  /^\s+|\s+$/g    去掉行首行尾的空格

f)       匹配中文

  /[\u4e00-\u9fa5]/     所有汉字的范围

g)      完美版getByClass

  **    单词边界       \b    使用两个\b包裹的是单独一个完整的单词

 1 function getByClass(oParent,sClass){
 2 
 3   var aEle = oParent.getElementsByTagName('*');
 4 
 5   var aResult = [];
 6 
 7   var re = new RegExp('\\b'+sClass+'\\b','i'); 
 8 
 9   for(var i=0;i<aEle.length;i++){
10 
11      if(re.test(aEle[i].className)){
12 
13         aResult.push(aEle[i]);
14 
15      }
16 
17   }
18 
19   return aResult;
20 
21 }
22 
23 //例::
24 //var aTar = getByClass(oUl,'box');
25 
26 //for(var i=0;i<aTar.length;i++){
27 
28 // aTar[i].style.background = 'red'; 
29 //}

猜你喜欢

转载自www.cnblogs.com/Jeremy-blogs/p/9389656.html