• 【Sizzle学习】之chunker表达式


    【题记】在彻底搞懂chunker之前,每当遇到Sizzle都很蛋疼,尼玛,一大串正则我竟然看不懂,杯具啊,baidu了,也google了,还是不懂,其实对于正则这破比玩样,哥们蛋疼,压根不愿意接触这东东,可是没办法啊,想彻底了解jQuery必须搞懂它的选择器,搞懂选择器呢,第一行就是这个正则,要搞懂这个,必须搞懂'?:'是什么东西,http://deerchao.net/tutorials/regex/regex.htm,通过这篇文章,懂了,匹配exp,不捕获匹配的文本,也不给此分组分配组号,尼玛,同时呢,之前在weibo面试,有一道面试题,题目是,“用正则去掉字符串中重复的字符”,如“asddddfff___sssoooo”变成“asdf_so”,哥顿时句话一紧,正则???哥的弱项啊,后来随便写了,哎,惭愧啊,刚刚哥把上面的文章一字一句看完了,代码能写出来了,贴出来,


    function del(str){    

        var reg = /(\w|\/)\1/;
        while(reg.test(str)){
            str = str.replace(reg, "$1");
        }
        return str;
    }

    alert(del("woshiii_______//////////asssdwkskkkkkaa"));


    其实很简单,哥当时为么没想到呢,哎哎哎,还有一个题目,

    var reg = /\w+#/img;
    var str = "asdas#asdasd";
    console.log(reg.test(str));
    console.log(reg.test(str));
    console.log(reg.test(str));
    console.log(reg.test(str));
    //结果是true,false,true,false 


     这是为什么呢?哥TMD当时懵了,想不到,事后,baidu了下,原来这样:

    RegExp.lastIndex 属性,详解如下:

    下次匹配的起始位置

    摘要

    regexp.lastIndex

    描述

    RegExp对象的属性lastIndex是一个可读写的值。对于设置了g性质的正则表 达式来说,该属性存放的是一个整数,它声明了紧接着上次找到的匹配文本的字符的位置。上次匹配的结果是由方法RegExp.exec()或 RegExp.test()找到的,它们都以lastIndex属性所指定的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字 符串中的所有匹配文本。注意,不具有性质g和不表示全局模式的RegExp对象不能使用lastIndex属性。

    由于这一属性是可读可写的,所以只

    参阅

    RegExp.exec()
    RegExp.test()

    【正文】

    A,拆解chunker正则表达式

     /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/

    首先,并列的三个捕获

     //
    (?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~]

    //

    这个又可以拆解为5个子表达式

        ⑴ (?:\((?:\([^()]+\)|[^()]+)+\)

                  匹配的是:(tag(tag)),其中tag是必须的,括号里面的’(tag)’非必须,不需要捕获匹配的文本

        ⑵ \[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]

                  匹配的时:[attr=’attrvalue’] [attr=attrvalue][attr=”attrvalue”][[]]…

        ⑶ \\.

        ⑷ [^ >+~,(\[\\]+)+

                  简单的选择块,伪类过滤块,e.g.”#id”,”.class”

        [>+~]

    (\s*,\s*)

       逗号,并列表达式分隔符

    ((?:.|\r|\n)*)

       其他并列的表达式

    测试用的例子

    function divChunker(str){
           var reg = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g;
           return reg.exec(str);
    }
     
    console.log(divChunker("#div .class p"));
    console.log(divChunker("div[name='is'] input"));
    console.log(divChunker("div[name='is']~div"));
    console.log(divChunker("#div .class p,div[name='is']~div"));


    参考资料:

    http://www.cnblogs.com/nuysoft/archive/2011/11/23/2260877.html 

    这哥们很NB,是我的榜样 

  • 相关阅读:
    总结的CSS简写表
    ASP.net 2.0:我还有多少秘密你不知道?(1)
    判断自然数的阶乘大于等于400,然后计算此数的平方,再一次减1计算其平方和,直到数字减小到0(演示Exit DO)
    JSP留言板程序开发过程
    double>string的时候,如何保留两位小数?
    asp如何清除html代码
    利用ASP.NET来访问Excel文档
    C#日期函数所有样式大全
    ASP.net在线购物商城系统完全解析
    创立公司的准备
  • 原文地址:https://www.cnblogs.com/sniper007/p/2295044.html
Copyright © 2020-2023  润新知