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"
);//替换匹配到的第一组的内容