正则表达式
元字符
--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 非
--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(); //判断一个字符串是否匹配
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");
---------------------------------------------------------
--字符串提取:
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个字符也能匹配,多个字符也能匹配,
这时会按照使用最多字符的放松来匹配。
--?是用来终止贪婪模式的(在限定符后面使用),当终止贪婪模式后会按照最小的方式来匹配。
--默认正则表达式采用贪婪模式,尽可能多的匹配。