[^&;]+(?:&\w+;[^&;]*)分析如下:
[^&;]+ 表示必须是以非&和非;的字符作为开始,数目1~n
(?:&\w+;[^&;]*) 中的(?:)表示这是一个非捕捉组,即Match.Groups中不会有该组的信息
&\w+;[^&;]* 表示由&开头加\w(必须有)再加;的形式,因为后面有[^&;]*,所以这个组的结尾要么不是;要么只有一个;
当然这个组中也只会有一个;
最后这里分析的字符串并不仅限于整个字符串,也可以是字符串的一个子串,因为没有限定^开始符和$终止符
如:d dd3&as;sss;;;dd;;ff3ddd&afdsf;&a;3;3;
(d dd3&as;sss)
(ff3ddd&afdsf;)
以多个非&或; 开头(至少一个),后续 :&字符串(字符\w);,以多个非&或; 结尾(可为0个)。
“……(?:&……”里的“?”实在让人费解啊,我只能做忽略理解了。我对正则一知半解,只能读到这程度。
为了便于理解,我把表达式[^&;]+(?:&\w+;[^&;]*)分行显示
----------------------------
第一行:[^&;]+
第二行:(?:
第三行:&\w+;[^&;]*
第二行:)
-----------------------------------------------------
第一行:匹配一个以上的不是[&]也不是[;]的字符;
第二行:匹配括号内的整个表达式(即第三行),但不捕获匹配的文本,所以在此不影响结果,
即表达式可以写成[^&;]+&\w+;[^&;]*,结果也是一样的。可能这么做是为了兼顾速度和以后的扩展;
第三行:首先匹配一个[&],再匹配一个以上的字符,接着匹配一个[;];最后匹配任意个不是[&]也不是[;]的字符。
例子:
表达式:
[^&;]+&\w+;[^&;]*或[^&;]+(?:&\w+;[^&;]*)
文本:
word1&word2;word3&word4;word5&word6&word7;
结果:红色为第一行匹配,绿色为第三行匹配
word1&word2;word3
word6&word7;