码迷,mamicode.com
首页 > Windows程序 > 详细

C#:正则注意点

时间:2017-11-26 19:32:43      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:转义   存在   判断   net   drivers   options   value   xxx   path   

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:\Windows\System32\drivers\etc\hosts";
            //此处因为有“贪婪模式”的存在,所以正则表达式中的 \\ 肯定匹配的是文件路径中的最后一个             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

 

C#:正则注意点

标签:转义   存在   判断   net   drivers   options   value   xxx   path   

原文地址:http://www.cnblogs.com/entclark/p/7899719.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!