码迷,mamicode.com
首页 > 其他好文 > 详细

正则表达式的知识点

时间:2016-07-18 02:04:26      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

(function() {
    //正则表达式定义
    //var expression = / pattern / flags;
    //每个正则表达式可以带一个或多个标志(flags): g全局模式、i不区分大小写、m多行模式
    var strtest = "abcdefjghijklmnopqrstuvwxyz1234567890shannonliang";
    var parttern1 = /shannonliang/g; //全局查找字符串
    var parttern1_1 = new RegExp("shannonliang", "g");
    var results = parttern1.test(strtest);
    console.log(results);
    var parttern2 = /an/g;
    results = parttern2.test(strtest);
    console.log(results);
    var parttern3 = /[1i]An/i; //匹配第一个1an 或 ian 不区分大小写
    var parttern3_1 = new RegExp("[1i]An", "g");
    results = parttern3.test(strtest);
    console.log(results);
    //  ([{\^$|?*+.}])  这些元字符需要进行转义
    parttern1 = /\[1i\]An/gi; //全局匹配  [1i]An 不区分大小写
    parttern1_1 = new RegExp("\\[1i\\]An", "g");
    results = parttern1.test(strtest);
    console.log(results);

    //多行模式
    var re = /[a-z]$/;
    var str = "ab\ncdef";
    console.log(str.replace(re, "#")); //ab\ncde#  
    re = /[a-z]$/m;
    console.log(str.replace(re, "#")); //a#\ncde#  
    /*
     * 
     *模式的基本属性
     * global  : 布尔值,是否设置了g标志
     * ignoreCase : 布尔值,是否设置了i标志
     * lastIndex : 整数 开始搜索下一个匹配项的字符位置,从0开始
     * multiline : 布尔值 是否设置了m标志
     * source : 正则表达式的字符串,字面量的形式,不包括标志,parttern模式
     * 
     * 
     * 
     * 
     */
    console.log("///////模式的基本属性/////////////");
    console.log(parttern1.global); //true
    console.log(parttern1.ignoreCase); //true
    with(parttern1) {
        console.log(multiline); // false
        console.log(lastIndex); //0
        console.log(source); ///  \[1i\]An
    }
    console.log(parttern1_1.source); // \[1i\]An
    console.log(parttern3.lastIndex); //0
    /*
     * RegExp 实例方法
     * 
     * exec()  主要使用的捕获组   返回的是Array的实例  有两个额外的属性 index 和input
     * test()  只是测试是否匹配
     */
    strtest = "mom and dad and baby";
    parttern1 = /mom( and dad( and baby)?)?/gi; //? 表示  0 或1 即有和没有两种情况
    var matches = parttern1.exec(strtest); // 这个返回值会有3个捕获组 ,每一个括号就是一个捕获组,整体就是一个捕获组。第一个捕获组是整体,然后一层一层剥落
    console.log(matches);
    console.log(matches instanceof Array); //true

    console.log(parttern1.lastIndex); //20 下一次执行匹配的位置(索引)
    console.log(strtest.length);
    parttern1 = /and/g; //全局的匹配每次匹配完成后,lastIndex会存入下次匹配的开始位置,如果不是全局的话,lastIndex就一直会存0
    matches = parttern1.exec(strtest); //第一次匹配
    console.log(matches);
    console.log(parttern1.lastIndex); //下次匹配的开始位置
    matches = parttern1.exec(strtest);
    console.log(matches); //第二次匹配
    console.log(parttern1.lastIndex);
    matches = parttern1.exec(strtest);
    console.log(matches); //只有2个and所以第三次匹配的时候,返回null
    console.log(parttern1.lastIndex); //第三次返回0
    matches = parttern1.exec(strtest); //第四次匹配
    console.log(matches);
    console.log(parttern1.lastIndex); //从头开始匹配
    parttern1 = /and/;
    matches = parttern1.exec(strtest);
    console.log(matches);
    console.log(parttern1.lastIndex); //0
    matches = parttern1.exec(strtest);
    console.log(matches);
    console.log(parttern1.lastIndex); //0

    var str = "000-00-0000";
    var partternstr = /\d{3}-\d{2}-\d{4}/;
    console.log(partternstr.test(str)); //true

    str = "15810280292";
    partternstr = /1[358]\d{9}/; //中括号中取的或值并且可以是范围值   大括号中取的是个数
    console.log(partternstr.test(str)); //true

    str = "3456";
    partternstr = /[3-6]{4}/;
    console.log(partternstr.test(str)); //true

    /*
     * RegExp 构造函数中的静态属性
     * 
     */
    console.clear();
    str = "this has been a short summer";
    partternstr = /(.)hort/g; //有一个捕获组
    console.log(partternstr.test(str));
    console.log("长属性名:");
    console.log(RegExp.input); //最近匹配的字符串
    console.log(RegExp.lastMatch); //最近匹配的项
    console.log(RegExp.lastParen); //最近的一次捕获组
    console.log(RegExp.leftContext); //input 字符串中lastMatch之前的文本
    console.log(RegExp.rightContext); //input 字符串中lastMatch之后的文本
    console.log(RegExp.multiline);
    //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n
    console.log("短属性名:")
    console.log(RegExp.$_);
    console.log(RegExp["$&"]); //不是有效的ES标识符
    console.log(RegExp["$+"]);
    console.log(RegExp["$`"]);
    console.log(RegExp["$‘"]);
    console.log(RegExp["$*"]);

    console.log("短属性名的捕获组:") // $1 ---- $9
    partternstr = /(.)(..)(s)( )/g;
    console.log(partternstr.test(str));
    console.log(RegExp.$1);
    console.log(RegExp.$2);
    console.log(RegExp.$3);
    console.log(RegExp.$4);
    console.log(RegExp.$5);
    console.log(partternstr.test(str));
    console.log(RegExp.$1);
    console.log(RegExp.$2);
    console.log(RegExp.$3);
    console.log(RegExp.$4);
    console.log(RegExp.$5);
    console.log(partternstr.lastIndex);
    console.clear();
    var regstr = "red blue green ,black orange";
    var parttern = /red|blue/i; //匹配red 或 blue
    var s = parttern.test(regstr);
    console.log(s);
    /* \b 之前或之后是结束的单词符
     * moon
     *  /\bm/ 匹配 "moon" 中的 ‘m‘;

        /oo\b/ 不匹配 "moon" 中的 ‘oo‘,因为 ‘oo‘ 后面的 ‘n‘ 是一个单词字符;

        /oon\b/ 匹配 "moon" 中的 ‘oon‘,因为 ‘oon‘ 位于字符串的末端,后面没有单词字符;

        /\w\b\w/ 不匹配任何字符,因为单词字符之后绝不会同时紧跟着非单词字符和单词字符。
     */

    parttern = /\s*\b\w+\b\s*/gim; //查找单词
    var m = parttern.exec(regstr);
    while (m && m[0]) {
        console.log(m[0]);
        m = parttern.exec(regstr);
    }
    /*
     * match   replace  split  三个字符串方法
     */
    var match = regstr.match(parttern); //单词的数组;
    console.log(match);
    console.log(match.length);

    var l = regstr.replace(/[^\x00-\xFF]/g, ‘**‘).length; //求字符串的字节数
    console.log(l);

    var pattern = /^1[358]\d{9}$/;
    console.log(parttern.test("13022678765"));

    str = "1025161262@qq.com.cn";
    parttern = /^\d+@qq\.com\.cn$/;
    console.log(parttern.test(str));

    //构建一个验证电子邮箱地址有效性的正则表达式。电子邮箱地址有效性要求(我们姑且这样定义):用户名只能包含字母数字以及下划线,最少一位,最多25位,
    //用户名后面紧跟@,后面是域名,域名名称要求只能包含字母数字和减号(-),并且不能以减号开头或结尾,然后后面是域名后缀(可以有多个),
    //域名后缀必须是点号连上2-4位英文字母

    var re = /^\w{1,15}(?:@(?!-))(?:(?:[a-z0-9-]*)(?:[a-z0-9](?!-))(?:\.(?!-)))+[a-z]{2,4}$/;

    //反向引用
    str = "aa11bb22cc33";
    str.replace(/(\d+)/g, "[$1]");
    console.log(str);

    var testString = "aabbcc";
    var regex = new RegExp(/(a)\1/g);
    var resultString = testString.replace(regex, "<img src=\"$1.png\"></img>");
    console.log(resultString);

    var name = "Doe, John";
    console.log(name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1"));

    //贪婪模式与非贪婪模式
    //添加修饰匹配次数的量词,默认为贪婪模式,尽可能多地匹配;
    //而非贪婪模式,是在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配。   *?

    //验证数字是否有重复
    var test = ["1,2,3,123,32,13", "12,56,89,123,56,98", "8,2,9,10,38,29,2,9", "8,3,9,238,93,23"];
    pattern = /\b(\d+)\b.*?\b\1\b/;

    test.forEach(function(item, index, array) {
        matches = pattern.exec(item);
        if (matches != null) {
            console.log(matches);
        }
    });
    //匹配最长的字符串重复内容
    var t = "aabecd1efghiejksabcd13";
    console.log("/////////////////////");
    for (i = 1; i < t.length; i++) {
        var obj = new RegExp(".*?(\\w{"+i+"}).*?\\1.*?","g");
        matches = obj.exec(t);
        if(matches == null){
            break;
        }
        console.log(obj.toString());
        console.log(matches);
    }
    
})();

 

正则表达式的知识点

标签:

原文地址:http://www.cnblogs.com/shannonliang/p/5679720.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!