- 正则表达式的开发一定要使用工具(除非特别简单的),推荐RegExBuilder.
- 最难以理解的是零宽断言和组,其中捕获组说明如下
(?'group') 把捕获的内容命名为group,并压入堆栈(Stack)
(?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
(?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
(?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
3. 正则表达式的本身,是(位置+长度)的匹配,而且匹配的部分,要满足正则表达式位置的连续。而零宽断言中的
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
都是匹配位置。
4.经过艰苦的思考,发现(?<=exp)的exp部分是从右向左匹配字符串的。
比如,下面的正则表达式,因为(?(t)(?'f'')|(?'x'"))* 先执行,会给x的组加上匹配,这样会导致(?(x)()|()),只会执行红色的部分。
(?<=^[^'"]*
(?(x)()|())
[^'"]*
(?(t)(?'f'')|(?'x'"))*
[^'"]*
)
1
5. <的都应该出现在前面,比如
(?<!exp) | 匹配前面不是exp的位置 |
(?<=exp) | 匹配exp后面的位置 |