本帖最后由 hehe04 于 2012-8-29 19:54 编辑
不知道为什么文本格式丢了 重新发把 。字数限制。。。。郁闷
8.定位符
单词通常以空格,段首,段尾,逗号,句号,问号等符号做边界,分隔符“-”也可以作为边界。定位符用于检索出这些边界。例如:\bw+\b。但要注意\b只表示单词与边界符号之间的位置,起到定位的作用,不表示边界符号本身。例如:I am jim, 如使用上面的正则表达式检索,只会检索出“I”,"am",“jim”三个单词,而不会包含空格。
定位符 | 说明 | ^ | 匹配字符串的开头位置,当出现边界时结束。例如:“^\w+ ” 注意与“[^\w+]”的区别 | $ | 匹配字符串的结尾位置。例如"\w+$",也就是说他会从字符串的末尾还是检索。 | \b | 匹配单词的边界位置 | \B | 匹配不是单词边界的位置 | \G | 匹配上一个匹配结束的位置(与方法Match.NextMatch()一起使用) | \A | 匹配字符串开头位置,类似于^,但不受Multiline选项的影响。 | \Z | 匹配字符串结尾的位置或换行符所在的位置(不受Multiline的影响) | \z | 类似$,但不受Multiline的影响 |
9.分组和后向引用
- (tr|b)ee这个正则表达式匹配tree或者bee,但是,“()”括号在正则表达式中,并不仅仅起着确定范围的作用。它同时会创建子表达式,每个子表达式形成一个分组,并把捕获到的与子表达式匹配的子串保存在分组中,以供将来使用。例如:
“fangyan33@gmail.com”
是一个邮箱地址字符串,我们使用下面的表达式来匹配这个字符串:
“(\w+)@(\w+).(\w+)”
这里有三个括号,就会形成三个分组,默认情况下会形成三个组号从左向右,依次是\1,\2,\3。 - 如果出现嵌套分组,它们的编号也按左括号出现的顺序排列
例如:My e-mail is ((fangyan33)@(gmail).(com))
那么最外面的括号是第1组,后面的依次类推。 - 。net提供了一个为分组命名的写法。
?<user>(\w+)@?<a>(\w+).?<b>(\w+)
此时第一组的名字就是user 以后就可以使用user来访问第一组了。
- 程序实例说明分组的用法:
- 有一个字符串:
“fangyan33@gmail.com fangyan33 abc@163.com aaa coco@gmail.com coco”
找出每一个email地址与后面的用户名相同的子串。例如: fangyan33@gmail.com fangyan33就是符合规则的子串。
foreach (Match match in Regex .Matches(str2, @"(\w+)@(\w+).(\w+) \1" )) //这里\1表示与正则表达式中第一组相同 { Console .WriteLine(match); } - 有一个电话簿: (010)23313442 (0931)2333345 (0755)86212233
将其中的号码替换成010-23321133这样的形式。
string str3 = "(010)23313442 (0931)2333345 (0755)86212233)" ; string regexstr=@"\((\d{3,4})\)(\d{7,8})" ; string result=Regex .Replace(str3,regexstr, "$1-$2");//这里$1表示第一组,$2表示第二组 Console .WriteLine(result); - 为分组命名:(还是使用上面转换电话号码的程序)
string str4 = "(010)23313442 (0931)2333345 (0755)86212233" ; string regexstr2 = @"\(?<areaCode>(\d{3,4})\)?<phoneNum>(\d{7,8})" ; string result2 = Regex .Replace(str4, regexstr2, "${areaCode}-${phoneNum}" ); //这里 ${} 的形式使用组名 Console .WriteLine(result);
|