var regStr = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g;这是一个网上javascript开源代码中的一段,没看明白。感觉很复杂。请高手帮忙分解说明下。

解决方案 »

  1.   

    匹配页面dom 元素。 比如通过 “#id” ".cls" 等等等等。
      

  2.   

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

  3.   

    分解成这样,可能更容易看懂些吧?
    ((?:\((?:\([^()]+\)|[^()]+)+\) --表达式1
    | --或者
    \[(?:\[[^[\]]*\]|[^[\]]+)+\]  --表达式2
    | --或者
    \\. --表达式3
    | --或者
    [^ >+~,(\[]+)+|[>+~])(\s*,\s*)?  --表达式4
      

  4.   

    自己摸索了大半天:============================================================先分解成1,2两段:
    1. ((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])2. (\s*,\s*)? 先分析简单的第二段(这是一个捕获组):\s: 表示的是 空格(包括tab键 和 换行)
    * : 表示前面字符重复 大于或等于 0次
    ?: 表示前面的段 出现0次或1 次
    ( ): 分组,将其他表达式包含,可以使被包含的表达式组成一个整体,在被修饰匹配次数时,可作为整体被修饰。另外,用括号包含的表达式,所匹配到的内容将单独作记录,匹配过程中或结束后可以被获取。
    所以这个模式能匹配类似: “” “,” “    ,   ”==============================================================现在再将复杂的第1段拆分成a,b两段 (他们之间的关系是 | ):a. (?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+b. [>+~]分析b段:
    用中括号 [ ] 包含多个字符,可以匹配所包含的字符中的任意一个。同样,每次只能匹配其中一个。
    所以b能匹配 : > 或 + 或 ~==============================================================现在再看a段:
    首先是一个非捕获组 (?: )
     (?: ): 包含其他表达式,可使被包含的表达式组成一个整体,在被修饰匹配次数时,可作为整体被修饰。 注意:非捕获组不记录所匹配的内容,比普通分组更节约内存资源。
     
     除去上面的(?: )就剩下:
    \((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+以或逻辑符号将其分为更容易理解的4段:==================================
    Aa: \((?:\([^()]+\)|[^()]+)+\)前是( 字符 后是 ) 字符,也就是匹配的这段在()里了剩余: (?:\([^()]+\)|[^()]+)+\([^()]+\)|[^()]+ 在非捕获组 (?: )内,结尾还有一个 + ,表示前导大于等于1次用中括号 [^ ] 包含多个字符,构成否定格式,可以匹配所包含的字符之外的任意一个字符。正则表达式中的特殊符号,如果被包含于中括号中,则失去特殊意义,但 \ [ ] : ^ - 除外。所以 [^()] 是匹配除了"()"以外的字符。==================================
    Ab: \[(?:\[[^[\]]*\]|[^[\]]+)+\]解释了这么多了,一般简单的相信都理解了。看看这段的复杂部分:
    \[[^[\]]*\]|[^[\]],其中\[[^[\]]*\]: 如果不理解,不急看 [^[\]]是匹配转义字符外的字符,OK了吧。==================================
    Ac: \\.匹配 \ 或 .
    ==================================
    Ad: [^ >+~,(\[]+ + : 前导大于等于1次
    匹配 ^ > + ~ , ( [ =================================================================