/w代表[A-Za-z0-9_]
/W代表[^A-Za-z0-9_]
[/w/W]就是匹配任何字符
<[\w\W]+>就是匹配一个html的开头标签吧
至于整个表达式的意思, 好像不是去匹配任何字符, 只是一个顺序肯定环视效果,表达式具体意途没看出来

解决方案 »

  1.   

    ^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$
    整体来说:
    ^和$对应字符串的开始和结尾
    (?:exp)意味着不为该捕获组命名
    中间的|为条件判断,满足前者就不进行后者的判断
    exp 的内容:
    \s*(<[\w\W]+>)[^>]*|#([\w-]*)
    前一个判断条件:\s*(<[\w\W]+>)[^>]*
    \s* 匹配任意个空白字符
    (<[\w\W]+>) 匹配以<开始,以>结尾. \w匹配单词字符, \W匹配非单词字符, [\w\W]+即匹配1个或一个以上的单词字符或非单词字符。(其实,意同.+)该捕获组被自动编号1
    [^>]* 匹配任意个不是>的字符
    后一个判断条件:#([\w-]*)
    #是普通字符
    ([\w-]*) 匹配任意个单词字符或-号。 该捕获组被自动编号1这个正则是在尝试匹配 <xxx> 和#id 的字符, 就是jquery的选择器, $("<xxx>")或者$("#id")
    以下是jquery的原文, 我加了点备注:
    // Handle HTML strings
    // $(obj)的用法, 首先判断是不是字符串
    if ( typeof selector === "string" ) {
    // 如果传进来的是html字符, 跳过正则判断
    if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
    // Assume that strings that start and end with <> are HTML and skip the regex check
    // 跳过判断, match被设为数组, 把传进来的html字符添加进去
    match = [ null, selector, null ]; } else {
    // 进行正则判断, 匹配参数是html字符或者是#id字符
    match = rquickExpr.exec( selector );
    }
    //上面不管哪种情况判断成真, match[1]的值都会为传进来的参数, 前者是作为了一个数组, 后者是正则匹配之后的捕获组值

    // Match html or make sure no context is specified for #id
    // 如果参数是html字符或者是#id字符, 进行以下处理
    if ( match && (match[1] || !context) ) {
    // 剩下的逻辑
    }
    // 其他的逻辑
    }
      

  2.   

    不太准确,不能说这个正则在匹配<xxx>, 应该说是这种情况:$(html, props)
    动态创建元素并追加到body中,
    匹配了前面的html字符以及后面的属性,事件和方法字符字符串
      

  3.   

    咋这么快就结贴。
    对   ?:\s*(<[\w\W]+>)[^>]*    有点忽悠忽悠。这个分明是匹配   <div>cc</div>more  
    为什么这样匹配,还没说清楚。
    这   应该说是这种情况:$(html, props)  跟你提供的正则没任何关系。这跟rsingleTag有关联。
    这么快就结了,真没意思。
     
      

  4.   


    嗯,第二个回复有误,请无视
    (当时粗粗看了一下rquickExpr的引用情况,理解陷入了误区,当然了,回头越想越觉着不对劲,囧~)
    今天翻看了一下源码(jquery-1.9.1),重新解释一下:
    先来说一下正则:
    rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,    // 匹配<tag>text, <tag>text</tag>text或#id文本, 也就是$("htmlText")和$("#id")用法
    rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, // 匹配<tag>, <tag/>或<tag></tag>文本, 也就是$("htmlText")用法, 和上面的区别在于标签之间不允许出现其他字符

    回到原文:
    // 以上省略代码若干...
    // 如前所述, 倘若是$("selector", context)用法里面selector传来的是html字符或者能与rquickExpr匹配, 进入该段逻辑
    if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array)
    if ( match[1] ) {
    // 这里是设定父节点, 判断是jq对象还是htmlElement对象, 最终设置为htmlElement对象
    context = context instanceof jQuery ? context[0] : context; // parseHTML会以context作为父节点创建htmlElement, 并且把创建出来的节点放进一个数组里面返回
    // 注意一下rquickExpr, 就算是$("<div></div>text"), 那么match[1]也只会是<div></div>, 这里不要理解错误
    // merge会把this与返回回来的节点数组进行合并, 加入到this, 也就是jq对象中
    // 关于this, jq的用法-每次$("xx"), 都会创建一个jq对象, 调试时你可以看到这个this的prototype拥有所有的jq方法
    // jq对象其实也就是一个数组, 然后中间的各种操作就是往里面添加数据, 去看看jq的makeArray你就知道了
    jQuery.merge( this, jQuery.parseHTML(
    match[1],
    context && context.nodeType ? context.ownerDocument || context : document,
    true
    ) ); // 处理$(html, props)情况:$("htmlText", {key1:value1,key2:value2,key3:value3,其他})
    // rsingleTag匹配html标签, isPlainObject是判断第二个参数是否是object- 
    if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
    for ( match in context ) {
    // Properties of context are called as methods if possible
    if ( jQuery.isFunction( this[ match ] ) ) {
    this[ match ]( context[ match ] ); // ...and otherwise set as attributes
    } else {
    this.attr( match, context[ match ] );
    }
    }
    } return this; // 处理$("#id")
    } else {

    }
      

  5.   

    jquery 解析正则表达式及常见的Regex规则和表达式 - 
    http://www.suchso.com/UIweb/jquery-Regex.html