javascript中的正则匹配学习

一:正则表达式的方法和修饰符:
  正则的基本语法有2种
  1直接量语法 ;如:/ab/g
  2. 创建RegExp对象的方法;如: new RegExp(/abcd/,g);

  • 正则的修饰符有三个:
    • g:全局匹配
    • i:执行对大小写不敏感匹配
    • m:执行多行匹配
  • 支持RegExp对象的属性有五种:
    • global:RegExp对象是否具有标志g;
    • ignoreCase:RegExp对象是否具有标志i;
    • lastIndex :一个整数,表示开始下一次匹配的字符位置;
    • multiline:RegExp对象是否具有标志。
    • source:正则表达式的源文本。
  • 支持RegExp对象的方法有三种:
    • compile:编译正则表达式;
    • exec :检索字符中指定的值,返回找到的值,并确定位置;
    • test :检索字符串中指定的值,返回true或false。
  • 支持正则表达式的String对象的方法有四种:
    • search:检索与正则表达式相匹配的值;
    • match : 找到一个或多个正则表达式的匹配;
    • replace : 替换与正则表达式匹配的字符串;
    • split :把字符串分割为字符串数组。
        //一:创建 RegExp(pattern,attributes);
            // new RegExp(pattern,attributes);
            // 返回一个新的RegExp对象,具有指定的模式和标志;
        // 1-1:支持正则表达式的string对象方法
        // 1:search()方法;返回值:匹配的第一个位置,未找到,返回-1
        var str = 'hello world,HElls worlds';
        console.log(str.search(/lo/));   //3 返回匹配到的位置
        console.log(str.search(/lo/g));  //3 还是返回第一个位置
        console.log(str.search(/world/g));//6
        console.log(str.search(/11/));    //-1  没有找到
        console.log(str.search(/HElls/i));
        //2. exec()方法:返回一个数组,存放匹配的结果,未找到返回null
        var str2 = 'longen and yunxi';
        console.log(/longen/.exec(str2)); //["longen", index: 0, input: "longen and yunxi"]
        console.log(str2.match(/longen/));//["longen", index: 0, input: "longen and yunxi"]
        console.log(str2.match(/longen/g));

        console.log(/1111/.exec(str2)); //  null

二:正则的方括号和小括号

        //[abc]   匹配abc里面任意一个字符
        var str = 'xuebangbang is programmer';
        console.log(str.match(/[abc]/g));   //["b", "a", "b", "a", "a"]
        //(xue|ge) 匹配里面的字符串xue或者ge
        console.log(str.match(/(xue|ge)/g)); //["xue"]
        //[^abc] 匹配不在abc里面的任意一个字符
        console.log(str.match(/[^abc]/g));   //["x", "u", "e", "n", "g", "n", "g", " ", "i", "s", " ", "p", "r", "o", "g", "r", "m", "m", "e", "r"];

三:正则的元字符

    // . 查找单个字符,除了换行和行结束符。
        // \w 查找单词字符。
        // \W 查找非单词字符。
        // \d 查找数字。
        // \D 查找非数字字符。
        // \s 查找空白字符。
        // \S 查找非空白字符。
        // \b 匹配单词边界。
        // \B 匹配非单词边界。
        // \0 查找 NUL 字符。
        // \n 查找换行符。
        // \f 查找换页符。
        // \r 查找回车符。
        // \t 查找制表符。
        // \v 查找垂直制表符。
        // \xxx 查找以八进制数 xxx 规定的字符。
        // \xdd 查找以十六进制数 dd 规定的字符。
        // \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
// =============================================================================
        //元字符用来匹配任何一个单字符
        var str = 'xue-bang_bang is a programmer!';
        // \w查找任意一个字母或下划线,等价于:/[A-Za-z0-9]/
        console.log(str.match(/\w/g));//["x", "u", "e", "b", "a", "n", "g", "_", "b", "a", "n", "g", "i", "s", "a", "p", "r", "o", "g", "r", "a", "m", "m", "e", "r"]
        console.log(str.match(/\w+/g));// ["xue", "bang_bang", "is", "a", "programmer"]
        //\W查找任意一个非单词字符     等价于:/[^A-Za-z0-9_]/
        console.log(str.match(/\W/g));  //["-", " ", " ", " ", "!"]
        //\.查找任意个字符,除了换行符和结束符
        console.log(str.match(/./g));//["x", "u", "e", "-", "b", "a", "n", "g", "_", "b", "a", "n", "g", " ", "i", "s", " ", "a", " ", "p", "r", "o", "g", "r", "a", "m", "m", "e", "r", "!"]
        //\d匹配任意一个数字字符,等价于:/[0-9]/
        var str2 = 'xue-bang_bang is 18 years old!'
        console.log(str2.match(/\d/g)); //["1", "8"]
        //\D 匹配任意一个非数字字符,等价于:/[^0-9]/
        console.log(str2.match(/\D/g));//["x", "u", "e", "-", "b", "a", "n", "g", "_", "b", "a", "n", "g", " ", "i", "s", " ", " ", "y", "e", "a", "r", "s", " ", "o", "l", "d", "!"]
        //\s 匹配任意空白,制表,换行符,等价于:/[\f\n\r\t\v]/
        var str3 = 'xue-bang_bang is 18\nyears old!'
        console.log(str2.match(/\s/g)); //[" ", " ", " ", " "]
        //\s匹配任意非空白字符:等价于/[^\f\n\r\t\v]/
        console.log(str3.match(/\S/g));//["x", "u", "e", "-", "b", "a", "n", "g", "_", "b", "a", "n", "g", "i", "s", "1", "8", "y", "e", "a", "r", "s", "o", "l", "d", "!"]
        //\b匹配一个单词边界,就是指单词和空格间的位置,比如'er\b'可以匹配never中的er,但是不能匹配verb中的er
        console.log(str3.match(/bang\b \bis\b/g)); //["bang is"]
        //\B匹配非单词边界,er\B能匹配verb中的er,但是不匹配never中的'er'
        console.log(str3.match(/an\B/g));   //["an", "an"]
        //\n匹配一个换行符,用exec()返回换行符被找到的位置
        console.log(/\n/g.exec(str3));  //["↵", index: 19, input: "xue-bang_bang is 18↵years old!"]

四:正则的量词

        // n+ 匹配任何包含至少一个 n 的字符串。
        // n* 匹配任何包含零个或多个 n 的字符串。
        // n? 匹配任何包含零个或一个 n 的字符串。
        // n{X} 匹配包含 X 个 n 的序列的字符串。
        // n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。
        // n{X,} 匹配包含至少 X 个 n 的序列的字符串。
        // n$ 匹配任何结尾为 n 的字符串。
        // ^n 匹配任何开头为 n 的字符串。
        // ?=n 匹配任何其后紧接指定字符串 n 的字符串。
        // ?!n 匹配任何其后没有紧接指定字符串 n 的字符串。
        //()里面的内容可以作为整体被修复

        var str = 'xue-bang_bang is 18\nyears old!';
        console.log(str.match(/an?/g)); //["an", "an", "a"]
        console.log(str.match(/an+/g)); //["an", "an"]
        console.log(str.match(/an*/g)); //["an", "an", "a"]
        console.log(str.match(/an{1,2}/g)); //["an", "an"]
        console.log(str.match(/an{2,}/g)); //null
        console.log(str.match(/an{1}/g)); //["an", "an"]
        console.log(str.match(/years\s*old!$/g)); //["years old!"]
        console.log(str.match(/^xue*/g)); //["xue"]
        //?=n的用法 :匹配任何其后紧接指定字符串n的字符串;
        console.log(str.match(/xue(?=-)/g));    //["xue"]
        //?!n的用法:匹配任何其后不紧接n的字符串
        console.log(str.match(/an(?!b)/g));    //["an", "an"]

        console.log(str.match(/(an|g_)/g));    //["an", "g_", "an"]

五:贪婪模式和非贪婪模式用法
   Javascript中的正则贪婪与非贪婪模式的区别是:被量词修饰的子表达式的匹配行为;
1.贪婪模式在整个表达式匹配成功的情况下尽可能多的匹配;
  贪婪模式量词如下:{x,y} , {x,} , ? , * , 和 +
2.非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配;
  非贪婪模式量词:{x,y}?,{x,}?,??,*?,和 +?

        //一:贪婪模式:
            var str = '<script>我叫胖胖<\/script>1111<script>我来自中国<\/script>';
            //贪婪模式
            console.log(str.match(/<script>.*<\/script>/));
            //非贪婪模式
            console.log(str.match(/<script>.*?<\/script>/));

            var str2 = '<script>我叫胖胖<\/script>1111<script>我来自中国1<\/script>222<script>我来自中国2<\/script>222';
            //贪婪模式
            console.log(str2.match(/<script>.*<\/script>222/));
            // 非贪婪模式
            console.log(str2.match(/<script>.*?<\/script>222/));

六:正则匹配的训练

        var str = 'my name is bangbang; I am 18 years old';
        var str2 = 'I am 18';
        console.log(str2.match(/\d+$/g));  //["18"]  匹配以数字结尾的
        console.log(str.replace(/\s/g,''));//mynameisbangbang;Iam18yearsold
        console.log(/^\d*$\d/.test(str));   //判断字符串是不是由数字组成
        // 分析:电话号码有区号(3-4位数字),区号之后使用 ”-” 与电话号码连接;
        // 区号正则:^\d{3,4}
        // 电话号码7~8位 正则 \d{7,8}
        var str3 = '0379-18317713';
        console.log(str3.match(/^\d{3,4}-\d{7,8}(-\d{3,4})?$/));        //电话号码正则
        //手机号码
        var str3 = '18317713031';
        console.log(str3.match(/^1[3|4|5|7|8]\d{9}$/));
        //删除字符串左右空格
        var str4 = ' my name is bangbang ';
        console.log(str4.replace(/^\s+|\s+$/g,''));     //my name is bangbang
        //匹配标签中的内容
        var str5 = '<ul><li>111</li><li>22222</li></ul>';
        console.log(str5.match(/<ul>([\s\S]+?)<\/ul>/g));

参考网址:http://www.cnblogs.com/tugenhua0707/p/5037811.html#_labe1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值