正则表达式问题,请高手帮忙分解说明 var regStr = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g;这是一个网上javascript开源代码中的一段,没看明白。感觉很复杂。请高手帮忙分解说明下。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 匹配页面dom 元素。 比如通过 “#id” ".cls" 等等等等。 /((?:\( (?:\([^()]+\) | [^()]+)+\) | \[ (?:\[[^[\]]*\]|[^[\]]+)+\] | \\. | [^ >+~,(\[]+ )+| [>+~] )(\s*,\s*)?/g 分解成这样,可能更容易看懂些吧?((?:\((?:\([^()]+\)|[^()]+)+\) --表达式1| --或者\[(?:\[[^[\]]*\]|[^[\]]+)+\] --表达式2| --或者\\. --表达式3| --或者[^ >+~,(\[]+)+|[>+~])(\s*,\s*)? --表达式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次匹配 ^ > + ~ , ( [ ================================================================= jquery ui 组件 dialog()方法弹出框消失问题 如何处理jsp中用java赋值的js变量 一百分,IE,FF下的事件穿透。 简单问题求助 正则提取超级链接 网页上使用动画小人(不是默林) 框架内刷新的问题? 请问如何用javascript关闭当前网页? 如何使 按钮延时 急 !!!! javascript调试总遇到函数未定义 浮动广告的页面滚动?? 鼠标光标控制屏幕滚动的问题
\[ (?:\[[^[\]]*\]|[^[\]]+)+\] |
\\. |
[^ >+~,(\[]+
)+|
[>+~]
)
(\s*,\s*)?/g
((?:\((?:\([^()]+\)|[^()]+)+\) --表达式1
| --或者
\[(?:\[[^[\]]*\]|[^[\]]+)+\] --表达式2
| --或者
\\. --表达式3
| --或者
[^ >+~,(\[]+)+|[>+~])(\s*,\s*)? --表达式4
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次
匹配 ^ > + ~ , ( [ =================================================================