- 正则表达式用来描述字符串的特征。
. | 除\n以外的任意的单个字符 |
a.b
axb a3b a.b
|
[] | 字符组:[]表示在字符组中罗列出来的字符,任意取单个 |
a[xyz]b
axb ayb azb
a[a-z]b
awb azb
a[a-zA-Z0-9汉字]b
a[-a-z]b
注意:a.b和a[.]b不一样。.出现在字符组中,表示一个普通的.并不是一个元字符了
|
| | 表示“或”的意思 |
a(x|y)b
z|food 要么z要么food
|
() | 表示“改变优先级”或者表示“提取组” |
* | 表示限定它前面的表达式出现0次或者多次 |
+ | 表示一次或多次,至少得出现一次 |
? |
表示可出现0次或者1次,最多出现一次。
?的另一个意思是终止贪婪模式。(当在“限定符”后使用?的时候,表示终止贪婪模式)
|
[0-9]{8} | 限定数字必须出现8次 |
[0-9]{4,9} | 最少出现4次,最多出现9次 |
[0-9]{4,} | 最少出现4次,最多无限定 |
^hl | 字符串必须以hl开头 |
hl$ | 字符串必须以hl结尾 |
a[^xyz]b | ab中间任意字符但不能为xyz其中任意一个 |
\d | 代表一个数字,等同[0-9] |
\D | 代表非数字,等同[^0-9] |
\s | 表示换行符、Tab制表符等空白字符(空格 回车 制表符) |
\S | 表示非空白字符 |
\w | 匹配字母或数字或下划线或汉字,即能组成单词的字符 |
\W | 等同[^\w] |
- C#中正则表达式相关的方法
Regex.IsMatch();//用来判断给定的字符串是否匹配某个正则表达式
Regex.Match();//用来从给定的字符串中按照正则表达式的要求提取【一个】匹配的字符串
Regex.Matches();//用来从给定的字符串中按照正则表达式的要求提取【所有】匹配的字符串
Regex.Replace();//替换所有正则表达式匹配的字符串为另外一个字符串
- 验证字符串是否是一个合法的邮政编码
while (true)
{
Console.WriteLine("请输入一个字符串:");
string str = Console.ReadLine();
//验证字符串是否是一个合法的邮政编码
//注意,要想完全匹配,必须加^和$。否则字符串中有一部分与给定的正则表达式匹配,就返回true了。
bool b = Regex.IsMatch(str,"^[0-9]{6}$");
Console.WriteLine("给定的字符串是一个合法的邮政编码吗?{0}", b);
}
- 用户输入一个数字,判断是否是10(含)-25(含)
while (true)
{
Console.WriteLine("请用户输入一个10(含)-25(含)之间的任何一个数字:");
string n = Console.ReadLine();
bool b = Regex.IsMatch(n, "^(1[0-9]|2[0-5])$");
Console.WriteLine(b);
}
- 思考
while (true)
{
Console.WriteLine("请输入:");
string msg = Console.ReadLine();
Console.WriteLine(Regex.IsMatch(msg, "^z|food$"));
}
结果:以z看开头或者以food结尾的都为true。
- 思考
while (true)
{
Console.WriteLine("请输入:");
string msg = Console.ReadLine();
Console.WriteLine(Regex.IsMatch(msg, "^(z|food)$"));
}
结果:要么z,要么food,其余全为false。
(为什么zzz,foodfood这种不行?我觉得,zzz是一个整体,不是以z开头,而是以zzz开头。)
- 判断一个字符串是不是身份证号码
//判断一个字符串是不是身份证号码
//1.长度为15位或者 18位的字符串,首位不能是零。
//2.如果是15位,则全部是数字。
//3.如果是18位,则前17位都是数字,末尾可能是数字也可能是X。
while (true)
{
Console.WriteLine("请输入身份证号码:");
string idNo = Console.ReadLine();
//两种写法
Console.WriteLine(Regex.IsMatch(idNo, @"^([1-9]\d{14}|[1-9]\d{16}[0-9xX])$"));
Console.WriteLine(Regex.IsMatch(idNo, @"^[1-9]\d{14}([0-9]{2}[0-9xX])?$"));
}
- .net正则表达式默认采用Unicode匹配规则。如果想要只匹配ASCII字符,需指定RegexOptions.ECMAScript选项。
- 字符串的提取
#region 字符串提取
string msg = "大家好,2021年3月12日是个好日子。嗯,9494,耶,886.";
//一般字符串提取不加^和$
//Regex.Match()只能提取一个匹配
//Match match = Regex.Match(msg, "[0-9]+");
//Console.WriteLine(match.Value);
//Regex.Matches()提取字符串中的所有匹配
MatchCollection matches = Regex.Matches(msg, "[0-9]+");
foreach (Match item in matches)
{
Console.WriteLine(item.Value);
}
Console.ReadLine();
#endregion
-
在正则表达式中只要出现了()就表示进行了分组。()既有改变优先级的作用,又具有提取组的功能。
用Regex.Matches()提取字符串,再用foeach( a item in b)展示出来。
item.Value表示本次提取到的字符串
item.Groups集合中存储的就是所有的分组信息。
item.Groups[0].Value与item.Value是等价的,都表示本次提取到的完整的字符串。
item.Groups[1].Value表示提取的第一组字符串。 -
提取文件中的文件名
#region 提取文件中的文件名
string path = @"D:\Program Files (x86)\Tencent\QQ\Bin\Common.dll";
//此处因为有“贪婪模式”的存在,所以正则表达式中的 \\ 肯定匹配的是文件路径中的最后一个 \
Match match = Regex.Match(path,@".+\\(.+)");
Console.WriteLine(match.Groups[1].Value);
Console.ReadLine();
#endregion
- 贪婪模式
#region 贪婪模式
贪婪模式
//string msg = "1111。11。111。111111。";
.+,默认按照贪婪模式来匹配,尽可能多的去匹配。
//Match match = Regex.Match(msg,".+");
//Console.WriteLine(match.Value);
//Console.ReadLine();
#endregion
结果:1111。11。111。111111。
#region 贪婪模式
//终止贪婪模式
string msg = "1111。11。111。111111。";
//.+,默认按照贪婪模式来匹配,尽可能多的去匹配。
//当在“限定符”后使用?的时候,表示终止贪婪模式。
//当终止贪婪模式后,会尽可能少的匹配。
Match match = Regex.Match(msg, ".+?");
Console.WriteLine(match.Value);
Console.ReadLine();
#endregion
结果:1
string msg = "1111。11。111。111111。";
Match match = Regex.Match(msg, ".+。");
Console.WriteLine(match.Value);
Console.ReadLine();
结果:1111。11。111。111111。
string msg = "1111。11。111。111111。";
Match match = Regex.Match(msg, ".+?。");
Console.WriteLine(match.Value);
Console.ReadLine();
结果:1111。
通过WebClient来提取Email地址
#region 通过WebClient来提取Email地址(这个案例自己没太写对吧,先不管)
//1.下载字符串
WebClient client = new WebClient();
string html = client.DownloadString("https://www.baidu.com/");
//从html字符串中提取邮件地址
MatchCollection matches = Regex.Matches(html, @"[-a-zA-Z0-9_.]+@[a-zA-Z0-9]+(\.[a-zA-Z]+){1,2}");
foreach (Match item in matches)
{
Console.WriteLine(item.Value);
}
Console.WriteLine("共{0}个邮箱地址。", matches.Count);
Console.ReadLine();
#endregion