zoukankan      html  css  js  c++  java
  • Regular expression

    
    Regular expression 用RegExp类表示正则表达式.
    
    正则表达式主要用来验证客户端的输入.填写完以后,发送给服务器.
    正则表达式:匹配和文本检索替换的函数.
    
    一,创建正则表达式,提供了2种方法.new和字面量
    (1)new 方式创建
    var box = new RegExp('box');    //box 是必须填入的字符串参数.
    document.write(box + "<br/>");    //打印出 /box/ //也是正则的边界
    
    
    var box = new RegExp('box', 'igm');    //第二个参数是模式修饰符
    document.write(box + "<br/>");
    
    模式修饰符: 
    i     代表忽略大小写
    g     全局作用域    
    m     多行匹配
    
    (2)字面量方式创建
    var box = /box/;        //使用字面量方式的正则
    alert(box);
    //如果想加入修饰符的话,直接加入就可以
    var box = /box/igm;
    alert(box);
    
    二,匹配正则表达式
    pattern用test和exec方法来匹配
    RegExp 对象的方法
    方法            功能
    test         在字符串中测试模式匹配,返回true 或false
    exec         在字符串中执行匹配搜索,返回结果数组.
    
    例子
    (1)使用new运算符的test正则表达式
    var patten = new RegExp('Box');
    var str = 'box';
    alert(patten.test(str));        //false 区分大小写
    
    var patten = new RegExp('Box', 'i');
    var str = 'box';
    alert(patten.test(str));        //true 忽略大小写
    
    (2)使用字面量方式test的正则表达式
    var box = /box/;
    var str = 'box';
    alert(box.test(str));
    
    (3)使用一条语句实现正则表达式 pattern.test(str)
    alert(/box/img.test("this is a Box, that is a pox!"));
    
    (4)使用exec来检测
    var pattern = /box/img;
    var str = 'this is a box,and that is a Box.';
    alert(pattern.exec(str));    //box
    alert(typeof pattern.exec(str));    
    
    三,使用字符串的正则表达式的方法
    除了test和exec方法,String对象也提供了四个使用正则表达是的方法.
    (1)match(pattern)                        返回pattern中的子串或null.
    (2)replace(pattern, replacement)     用replacement替换pattern
    (3)Seach(pattern)                        返回字符串中的pattern开始位置
    (4)Split(pattern)                        返回字符串指定pattern拆分的数组
    
    例子:
    (1)使用match 方法获取获取匹配数组
    var pattern =/box/ig;                    //忽略大小写并且全局搜素
    var str ='this is a box! that is a box.';
    alert(str.match(pattern));                //box,box
    alert(str.match(pattern).length);        //数组长度是2
    
    (2)使用search进行查找
    var pattern =/box/ig;
    var str ='this is a box! that is a box.';
    alert(str.search(pattern));        //10
    由于search方法查找的就返回,所以不存在全局g这个模式的概念.
    var pattern =/xxxx/ig;
    var str ='this is a box! that is a box.';
    alert(str.search(pattern));        //找不到返回-1
    
    (3)使用replace替换
    var pattern = /box/i;
    var str = 'this is a box, that is a box too';
    alert(str.replace(pattern, 'tom'));    
    由于不是全局的,所以this is a tom, that is a box too.
    var pattern = /box/ig;
    var str = 'this is a box, that is a box too';
    alert(str.replace(pattern, 'tom'));
    全局的,所以this is a tom, that is a tom too.
    
    (5)使用split差分字符串成数组
    var pattern = / /ig;
    var str = 'this is a box, that is a box too';
    document.write(str.split(pattern));     //长度是9个
    输出  this, is, a, box,, that, is, a, box, too
    
    
    四,正则表达式的静态属性和实例属性
    静态表达式直接调用,无需声明,而实例属性需创建正则表达式.
    属性            短名        含义
    input             $_         当前被匹配的字符串
    lastMatch         $&         最后一个匹配字符串
    lastParen         $+         最后一对圆括号内的匹配子串
    leftContext     $`         最后一次匹配前的子串
    multiline         $*         用于指定是否所有的表达式都用于多行的布尔值
    rightContext     $'         在上次匹配之后的子串
    
    var pattern = /(g)oogle/;
    var str = 'This is google!';
    pattern.test(str);                    //执行一下
    alert(RegExp.input);                 //This is google!
    alert(RegExp.leftContext);             //This is
    alert(RegExp.rightContext);         //!
    alert(RegExp.lastMatch);             //google
    alert(RegExp.lastParen);             //g
    alert(RegExp.multiline);             //false
    PS:Opera 不支持input、lastMatch、lastParen 和multiline 属性。IE 不支持multiline 属性。导致就不用了.
    
    RegExp对象的实例属性
    属性                    含义
    global                 Boolean 值,表示g 是否已设置
    ignoreCase            Boolean 值,表示i 是否已设置
    lastIndex             整数,代表下次匹配将从哪里字符位置开始
    multiline             Boolean 值,表示m 是否已设置
    Source                 正则表达式的源字符串形式
    PS:以上基本没什么用。并且lastIndex 在获取下次匹配位置上IE 和其他浏览器有偏差,主要表现在非全局匹配上。lastIndex 还支持手动设置,直接赋值操作。
    
    五.获取控制
    正则表达是的元字符是包含特殊含义的字符,它们会有一些特殊的功能,可以控制匹配的模式的方式.反斜杠后的元字符将失去其特殊意义.
    
    (1)字符类:单个字符和数字
    元字符/元符号                        匹配情况
    .                        匹配出换行符意外的任意字符
    [a-z0-9]                    匹配括号中的字符集中的任意字符
    [^a-z0-9]                    匹配任意不在括号中的字符集中的字符
    d                            匹配数字
    D                            匹配非数字,同[^0-9]相同
    w                            匹配字母和数字及_
    W                            匹配非字母和数字及_
    d                            匹配0-9之间的数字
    D                            匹配非0-9之间的数字 类似[^0-9]
    
    (2)字符类:重复字符
    元字符/元符号                            匹配情况
    x?                                     匹配0 个或1 个x
    x*                                     匹配0 个或任意多个x
    x+                                     匹配至少一个x
    (xyz)+                             匹配至少一个(xyz)
    x{m,n}                             匹配最少m 个、最多n 个x
    
    (3)字符类:空白字符
    元字符/元符                            号匹配情况
                                         匹配null 字符
                                         匹配空格字符
    f                                     匹配进纸字符
    
                                         匹配换行符
    
                                         匹配回车字符
    	                                     匹配制表符
    s                                     匹配空白字符、空格、制表符和换行符
    S                                     匹配非空白字符
    
    (4)字符类:替代字符
    元字符/元符                            号匹配情况
    this|where|logo                 匹配this 或where 或logo 中任意一个
    
    (5)字符类:记录字符
    元字符/元符                            号匹配情况
    (string)                             用于反向引用的分组
    1 或$1                             匹配第一个分组中的内容
    2 或$2                             匹配第二个分组中的内容
    3 或$3                             匹配第三个分组中的内容
    
    
    
    例子:
    (1)点可以代替除换行符意外的任意字符.
    var pattern = /g..gle/ig;
    var str = 'this is a g0agle';
    alert(pattern.test(str));        //true
    如果没有字符,或者为
    就是错误的.
    var pattern = /g..gle/ig;
    var str = 'this is a g
    agle';        //有换行符
    alert(pattern.test(str));        //false
    
    var pattern = /g..gle/ig;
    var str = 'this is a gagle';        //缺少一个字符
    alert(pattern.test(str));        //false
    
    var pattern = /g..gle/ig;
    var str = 'this is a ga00gle';        //多了一个
    alert(pattern.test(str));        //false
    
    (2)重复匹配 * 匹配0个或者多个
    var pattern = /go*gle/ig;        //o* 代表 匹配0个或多个o.
    var str = 'this is a ggle';        //0个是可以的
    alert(pattern.test(str));        //true
    
    
    (3)重复匹配 + 匹配至少一个或者多个
    var pattern = /go+gle/ig;            //匹配至少1个或者多个o
    var str = 'this is a ggle';        
    alert(pattern.test(str));            //false,因为没有o
    
    var pattern = /go+gle/ig;
    var str = 'this is a google';        //有2个,可以
    alert(pattern.test(str));            //true
    
    (4)匹配一个或者0个 ? 问号
    var pattern = /go?gle/ig;
    var str = 'this is a google';        //2个o就错了
    alert(pattern.test(str));            //false
    
    var pattern = /go?gle/ig;
    var str = 'this is a gogle';        //一个o是对的
    alert(pattern.test(str));            //true
    
    var pattern = /go?gle/ig;
    var str = 'this is a ggle';            //没有也可以
    alert(pattern.test(str));            //true
    
    组合:
    例如:  .?   代表任意字符,一个或者0个
    
    
    (5)区间  x{m, n}        匹配最少m 个、最多n 个x
    var pattern = /go{2,4}gle/ig;        //匹配2到4个o
    var str = 'this is a google';        //2个o
    alert(pattern.test(str));            //true
    
    绝对限定几次 比如 {2} 2次
    {3,} 表示3或者3个以上
    
    
    (6)字符类匹配
    [a-z] 表示26个小写字母都匹配
    var pattern = /go[a-z]gle/ig;
    var str = 'this is a google';    //o属于[a-z]
    alert(pattern.test(str));        //true
    
    var pattern = /go[a-z]gle/ig;
    var str = 'this is a go1gle';    //1不属于[a-z]
    alert(pattern.test(str));        //false
    
    [A-Z]    大写的A到Z
    [0-9]    0到9
    
    例如: [0-9]*        代表0次1次,或者多次的0-9的数字
    var pattern = /go[a-z]*gle/ig;        
    var str = 'this is a godfdsfdsgle';    //有很多次字符属于a-z
    alert(pattern.test(str));
    
    [^a-z]        ^符号就是取反,匹配不在括号里面的任意字符
    var pattern = /go[^a-z]gle/ig;
    var str = 'this is a go1gle';        //1不是a-z
    alert(pattern.test(str));            //true
    
    (7)锚元素匹配
    ^    行首匹配
    $    行尾匹配
    
    var pattern = /^[0-9]oogle/ig;
    var str = '9oogle';
    alert(pattern.test(str));    //true
    注意:这是一个在中括号[],外面添加的^,表示从行首匹配,放在里面是取反.
    var pattern = /^[0-9]oogle/ig;
    var str = '39oogle';
    alert(pattern.test(str));    //false
    这是因为,需要从头开始匹配,第二字符不是o,就返回错误.
    
    var pattern = /[W]oogle$/ig;    //结尾必须是[W]oogle
    var str = '!oogle is good';
    alert(pattern.test(str));        //false
    
    (8)w         字母数字和下划线
    var pattern = /[w]oogle/ig;
    var str = '_oogle';
    alert(pattern.test(str));    //true
    注意:只是下划线,除此之外都不是,比如点(.)或则斜杠等.
    
    W         除了字符数字和下划线以外的字符
    var pattern = /[W]oogle/ig;
    var str = '!oogle';                //!不是字母,也不是数字和下划线
    alert(pattern.test(str));        //true
    
    (9)s 匹配空白字符、空格、制表符和换行符, (一个空格)
    var parrent = /gosgle/ig;
    var str = 'go gle';            //一个空格
    alert(parrent.test(str));    //true
    
    var parrent = /gosgle/ig;
    var str = 'go  gle';            //2个空格
    alert(parrent.test(str));    //false
    
    (10) 表示到达边界或者空格
    var parrent = /gsogle/ig;
    var str = 'g ogle';            //e在边界
    alert(parrent.test(str));    //true
    
    var parrent = /gsogle/ig;
    var str = 'g ogle is not do';        //g ogle在边界.空格.
    alert(parrent.test(str));
    
    (11)      | 是或,选择模式.
    var parrent = /google|baidu|bing/;        //匹配三种模式
    var str = 'www.baidu.com';
    alert(parrent.test(str));        //true
    var str1 = 'www.bing.com';
    alert(parrent.test(str1));        //true
    
    (12)分组匹配 用括号括起来,代表一个字符 ()
    var parrent = /google{4,8}$/img;
    var str = 'this is a google';    
    alert(parrent.test(str));        //false
    错误的原因是要匹配e字母的4到8次,才可以.因为$限定了结尾.
    
    var parrent = /(google){4,8}/img;
    var str = 'this is a google';
    alert(parrent.test(str));    //false 
    错误的原因是分组之后,google代表一个字符,要4到8次google才可以.
    
    var parrent = /goog(le){4,8}/img;
    var str = 'this is a googlelelele';
    alert(parrent.test(str));    //true
    
    var parrent = /goog(le){4,8}/img;
    var str = 'this is a googlelelele';
    parrent.test(str);
    alert(RegExp.$1);         //le
    注意:RegExp.$1表示获取模式中第一个分组对应的匹配字符串
    
    var parrent = /goog(le){4,8}/img;
    var str = 'this is a googlelelele';
    document.write(str.replace(parrent, '<strong>$1<strong>'));        //this is a le
    $1表示匹配的第一个分组的内容,给html加粗.
    
    var parrent = /(.*)s(.*)/img;
    var str = 'baidu google';
    document.write(str + "<br/>");    //baidu google
    document.write(str.replace(parrent, '$2 $1'));//google baidu
    这段正则将分组$1和分组$2进行了交换.
    贪婪                惰性
    +                     +?
    ?                     ??
    *                     *?
    {n}                 {n}?
    {n,}                 {n,}?
    {n,m}                 {n,m}?
    
    (13)贪婪
    var parrent = /[a-z]/img;
    var str = 'baidu google';
    document.write(str.replace(parrent, '1'));    //11111 111111
    这是常规替换,将每一个符合规则的字符都替换为1
    
    var parrent = /[a-z]+/img;
    var str = 'baidu google';
    document.write(str.replace(parrent, '1'));    //1 1
    这里是贪婪,将符合规则的字符串全替换为1个1.
    
    var parrent = /[a-z]+?/;
    var str = 'baidu google';
    document.write(str.replace(parrent, '1'));    //1aidu google
    这个是惰性模式,但是开启全局的模式,那么即使开启惰性模式,也要都全是1
    
    var parrent = /8(.*)8/;
    var str = '8google8 8google8 8google8';
    document.write(str.replace(parrent, '<strong>$1</strong>'));
    //结果是google8 8google8 8google
    
    开启了懒惰模式
    var parrent = /8(.*?)8/;
    var str = '8google8 8google8 8google8';
    document.write(str.replace(parrent, '<strong>$1</strong>'));
    //结果是google 8google8 8google8,只有第一个被匹配了.
    
    var parrent = /8(.*?)8/g;
    var str = '8google8 8google8 8google8';
    document.write(str.replace(parrent, '<strong>$1</strong>'));
    //结果是 google google google
    
    (14) exec 返回数组
    var pattern = /^[a-z]+/;
    var str = 'google 2012';
    alert(pattern.exec(str));    //google
    
    var pattern = /^[a-z]+s[0-9]{4}$/;
    var str = 'google 2012';
    alert(pattern.exec(str));    //google2012
    
    var pattern = /^([a-z]+)s([0-9]{4})$/;
    var str = 'google 2012';
    document.write(pattern.exec(str));    //google 2012, google, 2012
    //array[0]是整个字符串
    //array[1]是第一个分组的字符串google
    //array[2]是返回分组的第二个字符串:2012.
    
    (15)捕获性分组,就是所有的分组都返回
    var pattern = /^(d+)([a-z])/;
    var str = '123abc';
    document.write(pattern.exec(str));    //123a,123,a
    //a[0] 123a
    //a[1] 123
    //a[2] a
    
    (16)非捕获性分组,只要在不需要捕获返回的分组前加上    ?: 就不会返回
    var pattern = /^(d+)(?:[a-z])/;    //a就没有返回
    var str = '123abc';
    document.write(pattern.exec(str));    //123a, 123
    
    var pattern = /(a?(b?(c?)))/;
    var str = 'abc';
    document.write(pattern.exec(str));    
    //第一步 a[0], 整个匹配到的字符串abc
    //第二步 a[1], 匹配第一个分组 (a?(b?(c?))), abc
    //第三步 a[2], 匹配第二个分组 (b?(c?)),        bc
    //第四步 a[3], 匹配第三个分组 (c?),         c
    
    (17)前瞻捕获(特定捕获,后面接着特定的字符)
    
    var pattern = /goo(?=gle)/;        //goo后面必须跟着gle才可以
    var str = 'google';
    alert(pattern.exec(str));        //返回goo,而不是google
    
    var pattern = /goo(?=gle)/;        //goo后面必须跟着gle才可以
    var str = 'googge';
    alert(pattern.exec(str));        //返回 null
    
    
    (18)使用特殊字符进行捕获,用反斜杠转义,才可以匹配
    var pattern = //?/;        // / 和 ? 都转义了.
    var str = '12//3d/?.!ef';
    alert(pattern.exec(str));    
    
    (19)换行模式
    var pattern = /d+/ig;
    var str = '121331
    324234
    3d323432ef';
    alert(str.replace(pattern, '#'));    //都替换了
    
    如果限定首部,那么必须开启换行模式---m
    var pattern = /^d+/igm;
    var str = '121331
    324234
    3d323432ef';
    alert(str.replace(pattern, '#'));
    
    
    五,常用的正则表达式
    1.检查邮政编码 规则:6位,并且第一位不为0
    var pattern = /[1-9][0-9]{5}/;
    var post = 123124;
    alert(pattern.test(post));
    
    2.文件压缩包 股则:后缀名zip rar.gz,文件名是字母数字下划线
    var str = '2-z.zip';
    var pattren = /^[w-]+.zip|rar|gz/;
    alert(str.match(pattren));
    
    3.删除多余空格
    var str = 'this is a  boy, that is   a girl.';
    var pattern = /s/img;
    alert(str.replace(pattern, ''));
    
    4.删除首尾空格
    var pattern = /^s+/; //强制首
    var str = ' goo gle ';
    var result = str.replace(pattern, '');
    pattern = /s+$/; //强制尾
    result = result.replace(pattern, '');
    alert('|' + result + '|');
    var pattern = /^s*(.+?)s*$/; //使用了非贪婪捕获
    var str = ' google ';
    alert('|' + pattern.exec(str)[1] + '|');
    var pattern = /^s*(.+?)s*$/;
    var str = ' google ';
    alert('|' + str.replace(pattern, '$1') + '|'); //使用了分组获取
    5.简单的电子邮件验证
    var pattern = /^([a-zA-Z0-9_.-]+)@([a-zA-Z0-9_.-]+).([a-zA-Z]{2,4})$/;
    var str = 'yc60.com@gmail.com';
    alert(pattern.test(str));
    var pattern = /^([w.-]+)@([w.-]+).([w]{2,4})$/;
    var str = 'yc60.com@gmail.com';
    alert(pattern.test(str));
  • 相关阅读:
    Pycharm在线/手动离线安装第三方库-以scapy为例(本地离线添加已经安装的第三方库通过添加Path实现)
    python+splinter实现12306网站刷票并自动购票流程
    利用RELK进行日志收集
    web安全之文件上传漏洞攻击与防范方法
    C# 使用 CancellationTokenSource 终止线程
    ASP.NET MVC 下拉框的传值的两种方式
    SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误。(provider: Shared Memory Provider, error:0
    C# .net中json字符串和对象之间的转化方法
    asp.net 未能加载文件或程序集“WebApi”或它的某一个依赖项。试图加载格式不正确的程序。
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4842610.html
Copyright © 2011-2022 走看看