当前位置: 移动技术网 > IT编程>开发语言>.net > 正则表达式初探

正则表达式初探

2019年11月02日  | 移动技术网IT编程  | 我要评论

郎咸平最新演讲,周瞳探案系列1,pkbyebye.biz

本章主要想和大家分享下正则表达式的一些基础用法,希望能够对一些小白有所帮助,也为了防止自己以后遗忘相关知识点,下面我们正式进入主题。

一、正则表达式

  1、正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。
  2、正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
  3、在编写处理字符串的程序或网页时,经常会有查找或替换符合某些复杂规则的字符串的需要。
  4、正则表达式就是记录文本规则的代码。

  作用:
    1、查找数据
    2、替换数据

  正则表达式能做什么(字符串的匹配、字符串的提取、字符串的替换)

二、正则表达式的构成

  1、普通字符

    这包括所有的大小写字母字符,所有数字,所有标点符号以及一些特殊符号。
    例如:hello world xyh666

  2、定义字符集(取值范围(该点都是匹配单个字符,要想匹配字符串需要结合限定符来实现)
    [a-e] 表示a到e这些字符中的某一个字符
    [aeiou] 表示aeiou这5个字符其中的某一个字符
    [a-za-z] 表示大写、小写字母中的某一个字符
    [0-9] 表示0到9之间某一个数字

    代表非
    [^lsjd]  :不是中括号中的任意一个字符
    [^a-f]  :a-f范围外的任意一个字符

  3、组合字符(大写表示非)(该点都是匹配单个字符,要想匹配字符串需要结合限定符来实现)

    \d  :匹配一个数字字符。等价于[0-9]。
    \d  :匹配一个非数字字符。等价于[^0-9]。
    \w  :匹配一个字母或一个数字或一个下划线或一个汉字。
    \w  :匹配一个非字母、非数字、非下划线和非汉字的字符。
    \s  :匹配一个任意的空白符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
    \s  :匹配任意一个非空白符。等价于[^ \f\n\r\t\v]。
    \b  :匹配单词的开始或结束。
    \b  :匹配不是单词开头或结束的位置。

  4、特殊字符

    $  :表示字符串的结尾位置(以什么结尾)
     :表示字符串的开始位置(以什么开始)(在取值范围中还表示非)
     :一个点表示匹配一个除换行符 \n之外的任何单字符(匹配单个字符,要想匹配字符串需要结合限定符来实现)
    或者的意思,指明两项之间的一个选择 与[...]类似
     :这个符号是用来转义
    ( ) 分组,标记一个子表达式的开始和结束位置

  5、常用限定符
    =================匹配次数=================
    {m}  :其前一单元严格出现m次(重复m次)
    {m,}  :其前一单元出现至少m次(重复m次或更多次)
    {m,n}  :其前一单元出现至少m,最多n次(重复m到n次)
    =======================================
    =================多次匹配=================
      :其前面那个单元出现0次或任意次数(重复零次或更多次)
      : 其前面那个单元出现1次或1次以上 至少匹配一次(重复一次或更多次)
    ?  : 其前面那个单元出现0次或1次(重复零次或一次)懒惰匹配(尽可能短匹配)
    =======================================
  6、贪婪与懒惰(贪婪模式和非贪婪模式)(尽可能长匹配和尽可能短匹配)
    *? 重复任意次,但尽可能少重复
    +? 重复1次或更多次,但尽可能少重复
    ?? 重复0次或1次,但尽可能少重复
    {n,m}? 重复n到m次,但尽可能少重复
    {n,}? 重复n次以上,但尽可能少重复

  7、分组

    当用()定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。

    默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

    我们可以通过“\数字”的方式进行引用已经存入缓存的组。\1引用第一个匹配的组,\2引用第二个组,以此类推。

    括号内的内容会被当成一个整体进行匹配。

  8、非获取匹配和预查

    非获取匹配:是指正则引擎不会把被匹配的组存入缓存,我们也无法通过“\数字”的方式进行引用我们的组。

    预查:预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(即用来预查的表达式字符串不会被消耗

    (?:pattern) 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分时很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

    (?=pattern) 非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“windows(?=95|98|nt|2000)”能匹配“windows2000”中的“windows”,但不能匹配“windows3.1”中的“windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    (?!pattern) 非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“windows(?!95|98|nt|2000)”能匹配“windows3.1”中的“windows”,但不能匹配“windows2000”中的“windows”。

    (?<=pattern) 非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|nt|2000)windows”能匹配“2000windows”中的“windows”,但不能匹配“3.1windows”中的“windows”。

    (?<!patte_n) 非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|nt|2000)windows”能匹配“3.1windows”中的“windows”,但不能匹配“2000windows”中的“windows”。

三、c#代码调用正则表达式

    命名空间 system.text.regularexpressions
    
    1、new regex(正则表达式).ismatch(要匹配的字符串)   返回bool
    2、regex.match
        match match = regex.match("age=30", @"^(.+)=(.+)$");
        if (match.success)
        {
            console.writeline(match.groups[0].value);//第0组 输出完整的字符串 age=30
            console.writeline(match.groups[1].value);//第1组 age
            console.writeline(match.groups[2].value);//第2组 30
        }
    3、regex.matches
        stringbuilder sb = new stringbuilder();
        sb.append("<name>张三</name>\r\n<name>李四</name>\r\n<name>王五</name>");

        matchcollection mc = regex.matches(sb.tostring(), @"(?<=<name>).*(?=</name>)");
        foreach (match m in mc)
        {
            console.writeline(m.value);
        }

四、示例说明

接下来针对第二大点的内容我们举些例子来说明:

未完待续.......

 

正则表达式测试器:

链接:https://pan.baidu.com/s/1cwyrlh2dwbbk1kvi2fcgdw 
提取码:nwyc

 

版权声明:本文部分描述摘自网络,如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网