zoukankan      html  css  js  c++  java
  • C#:正则注意点

    1.指定字符出现多次用 ([a-zA-Zxxx]+),不是 (a-zA-Zxxx)+,后面那个是这一组出现多次,对于贪婪模式来说可能有些问题

    2.贪婪模式,最好后面跟着一个结束标识符

    ①. 测试,输出结果是1111。11。111。111111。
        //贪婪模式,针对于这个对于这个正则(.)的尽可能多的去匹配,这一段字符都符合的就取下来
                string msg = "1111。11。111。111111。";
                //.+,默认按照贪婪模式来匹配,尽可能多的去匹配。
                Match match = Regex.Match(msg, ".+");
                Console.WriteLine(match.Value);
                Console.ReadKey();
    ②1111。11。111。111111。,使用Match,d+只匹配到1111,因为对于这个正则,第一个出现的1111,不会贪婪到最后,因为。不是数字,对于后面那段来说不匹配了
    ③终止贪婪模式,结果是1
                string msg = "1111。11。111。111111。";
                //.+,默认按照贪婪模式来匹配,尽可能多的去匹配。
                //当在“限定符”后使用?的时候,表示终止贪婪模式
                //当终止贪婪模式之后,会按照指定正则尽可能少的匹配。
                Match match = Regex.Match(msg, ".+?");
                Console.WriteLine(match.Value);
                Console.ReadKey();
    //注意:千万不要写成(.+)?,这样结果是1111。11。111。111111。,因为括号改变正则优先级问题,先计算(.+)这个里面的正则,所以全部匹配出来了,再计算?。除非是这样写(.+?)
    ④不要使用*,因为这个意思是零次或者多次,相当于{0,},会匹配不到结果的
               string str = "abbb";
                Match match = Regex.Match(str, ".*?");
                Console.WriteLine(match.Value);
                Console.ReadKey();
    ⑤ 结果是:1111。11。111。111111。
    string msg = "1111。11。111。111111。";
                Match match = Regex.Match(msg, ".+。");
                Console.WriteLine(match.Value);
                Console.ReadKey();
    ⑥结果是1111。,.+?阻止了贪婪模式,匹配到了1111,加上后面的。
      string msg = "1111。11。111。111111。1。1。1。";
                Match match = Regex.Match(msg, ".+?。");
                Console.WriteLine(match.Value);
                Console.ReadKey();
    ⑦结果是1111。11。111。111111。1。1。1。
     string msg = "1111。11。111。111111。1。1。1。";
                Match match = Regex.Match(msg, "(.+。)");
                Console.WriteLine(match.Value);
                Console.ReadKey();
    ⑧匹配名字,因为后面都有。句号,可用来作为标志的分隔符
      string msg = "大家好。我们是A.B.C。我是A。我是B。我是C。我是XXX。我是X.X.X。我是★XX★。呜呜。fffff";
    
                MatchCollection matches = Regex.Matches(msg, "我是(.+?)。");
                foreach (Match item in matches)
                {
                    Console.WriteLine(item.Groups[1].Value);
                }
                Console.ReadKey();
    ⑨提取文件中的文件名
        string path = @"C:WindowsSystem32driversetchosts";
                //此处因为有“贪婪模式”的存在,所以正则表达式中的 \ 肯定匹配的是文件路径中的最后一个 
                Match match = Regex.Match(path, @".+\(.+)");
                Console.WriteLine(match.Groups[1].Value);
                Console.ReadKey();
    

    3..net默认使用的是Unicode匹配模式‘’

    ①结果是true,连全角符号都匹配
    string msg = "123";//123 123
    bool b = Regex.IsMatch(msg, @"d+"); 
    ②结果是false
       string msg = "123";//123   123
    //这个可以准确判断是ASCII字符123,不包含unicode字符123,其实就是在输入法中使用“全角”输出123
       bool b = Regex.IsMatch(msg, @"d+", RegexOptions.ECMAScript);
    ③ true
     string msg = "abd097776_432ERWEWR__你好你好你好你好你好";
                bool b = Regex.IsMatch(msg, @"^w+$");
               
    ④false
       string msg = "abd097776_432ERWEWR__你好你好你好你好你好";
                bool b = Regex.IsMatch(msg, @"^w+$", RegexOptions.ECMAScript);
    

    4、 关于C#字符串中的转义问题 与  正则表达式中的的转义问题。

    //string reg = "d"; //此时c#会认为是一个字符串的转义符。
    如: 此时运行完毕后其实就是正常字符  d
     string reg = "\\d"; //此时c#会认为是一个字符串的转义符。
      bool b = Regex.IsMatch(@"d", reg);  //reg →  \d→ d,2重转义
      Console.WriteLine(b);
    结果是true,reg 就是正常字符\d,\d转义前面的就成普通的字符d
    ② Console.WriteLine("a\\tb");  a\tb

     5、 Replace的时候可以对输入的正则表达式再次操作,一般就是反向引用!

     Regex.Replace(msg, @"(.)1+""$1");//替换匹配到的第一组的内容

  • 相关阅读:
    第四次作业—— 分析比较各种软件构建环境
    如何实现点击事件触发之后刷新还保存原值
    简单理解js闭包
    javascript中 __proto__与prorotype的理解
    原生和jQuery的ajax用法
    getElementById和querySelector方法的区别
    关于javascript闭包理解
    第二篇 进销存管理系统冲刺博客
    个人项目:WC
    自我介绍+软工五问
  • 原文地址:https://www.cnblogs.com/entclark/p/7899719.html
Copyright © 2011-2022 走看看