因为括号改变正则云算法优先级问题

时间:2022-05-01 07:33:00

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