正则表达式总结

正则表达式
元字符
  --1   .      除\n任意的单个字符
  --2   []     []内任意单个字符
  --3   |      或(两边任意一个)
  --4   ()     改变优先级、提取组
  --5   *      限定前面的表达式可以出现0-多次(可有可无)
  --6   +      限定前面的表达式至少出现1次。
  --7   ?      限定前面的表达式出现0次或1次
  --8   {n}    限定前面的表达式,必须只能出现n次
         {n,m}  至少出现n次,最多出现m次
         {n,}   至少n次
 
  --9   ^       在[]内表示  非
                 在字符串的开始,表示匹配一行的开始
  --10  $       匹配一行的结尾
  --11  ^abc$   表示完全匹配,只能是abc

----------------------------------------
         \d      代表一个数字
         \D      表示\d的反面,非数字
        
         \s       空白符
         \S       非空白符
        
         \w       匹配字母或数字或下划线或汉字,即能组成单词的字符,除%&#@!$等字符。[a-zA-Z0-9_汉字]
         \W      非
 
  注意:d:digital;s:space、w:word。大写就是“非”
 
-----------------------------------
  例:
  1. ^z|food$   表示以z开头的任意字符串 或 以food结尾的任意字符串
  2. z|food     表示 z 或 food (不表示zood),但是,由于该正则表达式没有写^和$,
                 所以在整个字符串中,只要有任意一个位置出现z或food都可以
  3. ^(z|f)ood$  表示zood 或 food
  ----------------------------------------------------
 
  在.net中使用正则表达式用Regex类. 如果要用到上面的元字符,就需要将元字符转义 '\'.
 
  Regex.IsMatch();  //判断一个字符串是否匹配    
        例如:Regex.IsMatch("bbbbg","^b.*g$");  Regex.IsMatch(“email12@mail.com”, @“^\w+@\w+\.\w+$”);可以使用汉字的。
  Regex.Match();    //从某个字符串中提取匹配正则表达式的某个子字符串,(只能匹配一个)
  Regex.Matches();  //字符串提取,可以提取所有匹配的字符串 (匹配多个)
  Regex.Replace();  //字符串替换,把所有匹配正则表达式的字符串替换为对应的字符串  email = Regex.Replace(email, @"(\w)(\w)+(@\w+\.\w+)", "$1*****$3");
 
  ---------------------------------------------------------

--字符串提取: 
Match match = Regex.Match("age=30", @"^(.+)=(.+)$");
if (match.Success)
{
    Console.WriteLine(match.Groups[1] .Value);
    Console.WriteLine(match.Groups[2] .Value);
注意Groups的序号是从1开始的,0有特殊含义

在做字符串提取的时候【一般】都不加^和$,因为字符串提取,是在原来的字符串中只要找到一部分匹配就可以提取了。字符串中有几个(),就有几个分组。
例如:从文本提取出名字
Match match = Regex.Match("大家好。我是baby。我22岁了。", "我是(.+)。");//错,是贪婪模式,匹配出的结果是“baby。我22岁了”
Match match = Regex.Match("大家好。我是baby。我22岁了。", "我是(.+?)。");//正确
因为+、*的匹配默认是贪婪模式(尽可能多的匹配),故需要在+、*后添加?就变成非贪婪模式(? 的另外一个用途)。
 
Match获得的是匹配的第一个。Regex.Matches方法可以获得所有的匹配项。
例如:
从一段文本中提取所有的数字
MatchCollection matches = Regex.Matches("大家好,我是Heb,我22岁了,身高180,我们团队有3个女女!", @"\d+");
for (int i = 0; i < matches.Count; i++)
{
       Console.WriteLine(matches[i].Groups[1].Value);
}
 
抓取所有超链接,特征:href="地址
MatchCollection matches = Regex.Matches(content,"<a\s*href='(.+?)'\s*");

  -----------------------------------------------
  贪婪模式:
  --当正则表达式提取的时候,如果1个字符也能匹配,多个字符也能匹配,
    这时会按照使用最多字符的放松来匹配。
   
  --?是用来终止贪婪模式的(在限定符后面使用),当终止贪婪模式后会按照最小的方式来匹配。
  --默认正则表达式采用贪婪模式,尽可能多的匹配。
原文地址:https://www.cnblogs.com/chay1227/p/2973122.html