A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hehe04 中级黑马   /  2012-8-29 19:46  /  1760 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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就是符合规则的子串。
string str2 = @"fangyan@gmail.com fangyan thundt@163.com cc coco@gmail.com coco" ;
            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);





10.预查


        * 非捕获分组  ?:
当我们需要使用()时,但又不想使其分组以增加不必要的内存开销,就可以使用?:
例如:(?:tr|b)ee 此时,系统不会为其分组和指定组号。


        * 正向预查 (?=)和负正向预查(?!)
举例说明,例如:我们想获取一系列邮箱地址中的用户名时。 “fangyan33@gmail.com 123@163.com nsna@qq.com
正则表达式: (/w+)(?=@)   负正向预查表示后面跟的是非@。


        * 反向预查(?<=)和负反向预查(?<!)
举例说明,例如:我们想获取一系列邮箱地址中的二级域名时(163 ,gmail,qq等 )。 “fangyan33@gmail.com 123@163.com nsna@qq.com
正则表达式: (?<=@)(/w+)   负正向预查表示前面的是非@。



11.常用正则表达式选项

选项名称说明IgnoreCase忽略大小写匹配时不区分大小写,默认区分Multiline多行模式更改$和^的含义,使$匹配整个字符串的结尾位置(即\n之前的位置)。使^匹配整个字符串的开头位置,也匹配任意一行的开头位置(即\n之后的位置)Singleline单行模式更改"."的含义,使他匹配任何字符,包括换行符(\n)(注意:它和Multiline之间没有任何联系,虽然名称看上去有)IgnorePatternWhitespace忽略空白忽略表达式中的非转义空白,并启用由#标记的注释ExplicitCapture显示捕获仅捕获已经被显式命名的组



12.正则表达式中的注释

        * (?#注释内容)


        * #注释内容  
这个是多行注释,注释内容和正则表达式之间可以有空格,正则表达式会忽略这些空格;


1 个回复

倒序浏览
本帖最后由 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就是符合规则的子串。
      string str2 = @"fangyan@gmail.com fangyan thundt@163.com cc coco@gmail.com coco" ;
                  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);





回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马