• C#正则表达式积累


    -------------------------------------C#的正则表达式-------------------------------------------

    @的作用:
    string x="D:\\My Huang\\My Doc";
    string y = @"D:\My Huang\My Doc";
    这两句作用相等
    C#中想用的类和方法:
    string str = "1";
    Regex r1 = new Regex(@"\d");--里面放的是正则格式,如果是一串间的字符,那就原样匹配
    bool result = r1.IsMatch(str);
    返回的是true
    IsMatch()只要有合适的就返回true,只能做大概的判断
     
    纯记忆部分
    \d  0-9的数字--(目前还不明白1.5所不算)用IsMatch()肯定测不出来,因为既有1又有5.
    \D  \d的补集
    \w  单词字符,指大小写字母、0-9的数字、下划线
    \W  \w的补集
    \s  空白字符,包括换行符\n、回车符\r、制表符\t、垂直制表符\v、换页符\f
    \S  \s的补集
    .  除换行符\n外的任意字符
    […] 里面的格式作为一个整体,匹配的是一个字符,比如[abc]匹配a,匹配b也匹配c
    [^…]  匹配非[]内所列出的字符
    拆分操作:
    string pattern = "[#$]"; //也可以写成string pattern = "#|$"; 
    String input="11$8$8#99";
    string[] rs = Regex.Split(input, pattern);
    数组是 11 8 8 99
    注意:如果想要匹配. $ * ^ ) ( [ ] 等等字符串需要转义,例如"\$" 但是这样就不用\转义了[$]
    string i = "hello,world";
    Regex result = new Regex("hello,world");//true
    result.IsMatch(i)
    这两句值得揣摩
    Regex result = new Regex("^hello,world$");//true
    Regex result = new Regex("hello,worl");//false
    Regex result = new Regex("^hello,worl$");//false
    Regex result = new Regex("^hello,worl");//true
    常用的方法
    string i = "hellohello";
    Regex result = new Regex("hello");
    result.Matches.Count(i);//2
    纯粹记忆部分:
    与次数相关的
    {n}     匹配前面的字符n次
    {n,}    n次或多于n次
    {n,m}   n到m次
    ?       匹配前面的字符0或1次
    +       1次或多于1次
    *       0次或式于0次
    定位的字符
    ^  表示其后的字符必须位于字符串的开始处
    $  表示其前面的字符必须位于字符串的结束处
    \b  匹配一个单词的边界     注意:所谓的边界不光是空格还有, . - # $ % 等等不是单词中元素的都视为边界。(2,d,_)都不是边界
    \B  匹配一个非单词的边界
    String str ="hello,everybody,happy everyday";
    Regex r = new Regex(@"^hello,([a-z]{5})body,happy \1day$");
    ([a-z]{5})为一组,后面的\1就算是指的它
     r.Match(str).Groups[1].Value
     得到"every"
     
    String str = "zhangranzhang";
    Regex r = new Regex(@"^(?<a>[a-z]{5})ran\1$");//给组定义一个名字
    Console.WriteLine(r.Matches(str).Count);
    Console.WriteLine(r.Match(str).Groups[1].Value);//通过索引取值
    Console.WriteLine(r.Match(str).Groups["a"].Value);//通过键取值
     
    String str = "zhangzhang ran";
    Regex r = new Regex(@"([a-z]{5})\1");
    Console.WriteLine(r.Replace(str,"$1"));
    取代重复,字段 输出zhang ran
    Regex r = new Regex(@"(?:[a-z]{5})");
    ?:表示非捕获组,这时引擎不会将改组保存起来,在用不到组是这样做节省资源
                                                                                               
    贪婪与非贪婪:默认情况,引擎是贪心的,但是在* + 等表示字数的符号后面加?就改为费贪心的了
    String myStr = "everyboy is good boy";
    Regex res = new Regex(@".*boy");
    Console.WriteLine(res.Match(myStr).Value);//输出everyboy is good boy
    非贪婪
    Regex res = new Regex(@".*?boy");
    Console.WriteLine(res.Match(myStr).Value);//输出everyboy
    贪婪与回溯
    正则表达式是用回溯的方法来实现贪婪匹配的
    String myStr = "everyboy, is good boy";
    Regex res = new Regex(@".*boy,");
    在上面的表达式中,引擎先扫描整个字符串,当前三个字符boy匹配完其实是移动到末尾匹配到了最后一个boy
    但是在匹配,的时候出现问题,只能回溯到最近的一个boy再去匹配,所以输出的内容是
    everyboy, 
    (?>…)这是用来定义非回溯正则的
    Regex res = new Regex(@"(?>.*)boy,");
    这样就是非回溯的,这样一来,就无法匹配了,IsMatch()返回false
    正向预搜索与反向预搜索
    正向预搜索包括:正声明(?=),负声明(?!)
    String str = "i love the cute nation the big world";
    Regex r = new Regex(@".{3,4}\b(?=world)");   换成(?!world)就是指后面不是world
    匹配后面跟着一个world的字符串
    反向预搜索
    正声明(?<=),负声明(?<!)
  • 相关阅读:
    spring data jpa序列化问题
    观察者模式(bilibili)
    观察者模式之Spring: event和listener
    观察者模式之Observer和Subject
    Mybatis Plus官网
    Hackinglab之注入关
    利用GitHub进行团队开发
    IIS安装Web时数据库参数配置文件写入权限验证失败
    流量分析基础篇
    Mysql启动错误1045(28000)
  • 原文地址:https://www.cnblogs.com/zhangran/p/2390521.html
Copyright © 2020-2023  润新知