宝哥软件园

正则表达式捕获组/非捕获组介绍

编辑:宝哥软件园 来源:互联网 时间:2021-10-18

捕获组语法:字符描述模式匹配模式并捕获结果,并自动设置组号。(abc) d匹配abcd或abcd(?名称模式)或(?模式)匹配name'pattern并捕获结果,并将名称设置为组名。 n反向引用捕获组。其中num是正整数。(w)(w)21将abbak名称或k' name '的反向引用与命名的捕获组匹配。其中name是捕获组名称。(?group w)ABC g group匹配xabcx。在圆括号中指定子表达式后,匹配该子表达式的文本(即由该分组捕获的内容)可以在表达式或其他程序中进一步处理。默认情况下,每个捕获组将自动拥有一个组号。规则是:从左到右,用分组的左括号标记,第一个分组的组号是1,第二个是2,依此类推。例如:(d{4})-(d{2}-(d{2})) 1 1 2 3 32以下是用程序处理捕获组、解析Url地址和显示所有捕获组的示例。您可以看到按顺序设置的采集组编号。Regex。Match方法复制代码如下:使用系统。text .正则表达式;namespacwuhong . test { class program { static void main(string[]args){//target string source=' http://reg-test-server :8080/download/file 1 . html # ';//常规字符串正则表达式=@ '( w): //([/:])(: d)?([^# :]*)';Regex regUrl=新Regex(Regex);//匹配正则表达式Match m=regUrl。匹配(来源);控制台。写线(m .成功);如果(m .成功){//捕获的组存储在匹配中。将集合分组,索引值从1开始,整个匹配的字符串值位于索引0处。//按照“组号:捕获内容”的格式显示(int I=0);群体计数;i ) {控制台。WriteLine(字符串。格式(' {0} : {1} ',I,m . group[I]);} }控制台。ReadLine();} } }

您也可以自己指定子表达式的组名。这样就可以在表达式或程序中直接引用组名,当然还可以继续使用组号。但是,如果正则表达式中既有普通捕获组,又有命名捕获组,就要特别注意捕获组的编号。编号规则是先给普通捕获组编号,然后给命名的捕获组编号。例如:(d{4})-(?日期 d {2}-( d {2}) 1 1 3 2 23接下来,在程序中处理命名的捕获组,显示由混合规则生成的组号,并用捕获组的内容替换源字符串。您可以看到,普通捕获组首先被编号,然后命名的捕获组被编号。Regex。Replace方法复制代码如下:使用系统。text .正则表达式;namespacwuhong . test { class program { static void main(string[]args){//target string source=' http://reg-test-server :8080/download/file 1 . html # ';//正则表达式,名称两组字符串正则表达式=@'(w )://(?server[^/:])(?端口:d)?([^# :]*)';Regex regUrl=新Regex(Regex);//匹配正则表达式Match m=regUrl。匹配(来源);控制台。写线(m .成功);如果(m .成功){//捕获的组存储在匹配中。将集合分组,索引值从1开始,整个匹配的字符串值位于索引0处。//按照“组号:捕获内容”的格式显示(int I=0);群体计数;i ) {控制台。WriteLine(字符串。格式(' {0} : {1} ',I,m . group[I]);} }//替换字符串//$ group number”指的是捕获组的内容。//需要注意的是,“$ group number”后面不能跟数字形式的字符串。如果发生这种情况,您需要使用命名的捕获组,并参考格式“$ {group name}”字符串替换=string . format(' $ 1:/{ 0 } { 1 } $ 2 ',' new-reg-test-server)。字符串结果=regUrl。替换(来源,替换);控制台。WriteLine(结果);控制台。ReadLine();} } }

非捕获组语法:字符描述示例(?pattern)匹配模式,但不捕获匹配结果。工业?y|ies)匹配“行业”或“产业”。(?=pattern)零宽度正向预览,不捕获匹配结果。“窗户(?=95 | 98 | NT | 2000)“window 2000”中匹配的“Windows”与“Windows3.1”中的“Windows”不匹配。(?图案)宽度为零的负预览,并且不捕获匹配结果。“窗户(?95 | 98 | NT | 2000)“window 3.1”中匹配的“Windows”与“Windows2000”中的“Windows”不匹配。(?=pattern)零宽度正向查找,不捕获匹配结果。" 2000 (?=Office | Word | Excel)“Office 2000”中的“Match 2000”与“Windows2000”中的“2000”不匹配。(?模式)零宽度负回溯,并且不捕获匹配结果。" 2000 (?Office|Word|Excel)'与' Windows2000 '中的' 2000 '匹配,与' Office2000 '中的' 2000 '不匹配。非捕获组仅匹配结果,但不捕获结果,也不分配组号。当然,它们不能在表达式和程序中进一步处理。首先(?pattern)与(pattern)的区别仅在于不会捕获结果。接下来的四个非捕获组用于匹配(或不匹配)模式位置之前(或之后)的内容。匹配的结果不包括模式。示例:(?=(w))。*(?=/1)匹配不包含属性的简单HTML标记中的内容。例如:divhello/div中的hello,匹配结果不包括前缀div和后缀/div。下面是程序中一个非捕获组的示例,用于提取邮政编码。可以看出,反向回查和反向预查都没有被捕获。Regex。Matches方法复制代码如下:使用系统。文字。正则表达式;名为spacewuhong。test { class program { static void main(string[]args){//target string source='有6组数字:010001、100、21000、310000、4100011、510002,所以挑出邮政编码。//常规字符串正则表达式=@ '(?d)([1-9]d{5})(? d)';Regex regUrl=新Regex(Regex);//获取所有匹配的match collection mlist=regurl . matches(来源);for(int j=0;j mList。计数;J) {//显示每组,可以看到每组只有组号为1的项目,没有为(int i=0)抓取反向查看和反向预览;I mList[j]. group . count;i ) {控制台。WriteLine(字符串。格式(' {0} : {1} : {2} ',j,I,mList[j]。第[i]组);} }控制台。ReadLine();} } }

语法:字符描述示例(?#comment)comment是注释,对正则表达式的处理没有影响。2[0-4]d(?#200-249)|25[0-5](?#250-255)|1?dd?(?#0-199)匹配0-255的整数,这没有解释。

更多资讯
游戏推荐
更多+