学习笔记---正则表达式

  • 正则表达式用来描述字符串的特征。
.除\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]bab中间任意字符但不能为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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值