正则表达式在线测试工具:https://regex101.com/
一、限定符的含义
?:表示它前面的字符出现0次/1次。例如:
used?
//可以匹配use或used(d可以说0/1次,可缺省)
*:表示它前面的字符出现0次或多次
ab*c
可以匹配ac/abc/abbbbbc
不能匹配adc/addddc
+:匹配出现1次以上的字符
ab+c
可以匹配abc/abbbbbc
不会匹配ac
{ }:精准匹配次数->(次数介于a,b之间,b可以缺省表示a次以上)
ab{2,6}c //缺省ab{2}c
//匹配abbc到abbbbbbc之间的字符
( ):字符组合
(ab)+
//匹配含有ab的字符串
二、或运算符
|:表示两者出现一个即可(需要与括号联用,否则会按照顺序取或)
a (cat|dog)
//可以匹配a cat或者a dog
a cat|dog
//可以匹配a cat或者dog
[ ]:字符类;检测由括号字符构成的字符串
[abc]+
//可以匹配abc/aaabbcc
//可以指定范围;例如:[a-z]为所有小写字符、[a-zA-Z0-9]是所有英文字符+数字
三、取反
^:查找除指定字符意外的内容,可以与[ ]联用
[^0-9]+
//匹配不包含数字的内容
四、元字符
\d | 数字 |
\D | 非数字 |
\w | 单词 |
\W | 非单词 |
\s | 空白符(包含tab和换行) |
\S | 非空白符 |
. | 任意字符 |
^ | 匹配行首 |
$ | 匹配行尾 |
^a //只会匹配每行第一个a
a$ //只会匹配每行最后一个a
五、贪婪与懒惰匹配
默认情况下,正则表达式会尽可能多的匹配字符串,但有的时候我们并不需要这样
<.+> //会将html内部的整个字符串进行匹配
<.+?> //只会匹配hmtl两边的尖括号内容
使用?会将默认的贪婪匹配切换为懒惰匹配
六、实例测试
1.RGB颜色值匹配
#[0-9a-zA-Z]{6}\b
//RGB值为十六进制数,只能取自0-9或者a-z(不区分大小写)
//后面加上{6}来保证其只有6位
//最后加上\b来划定字符边界(不能超出)
2.IPv4地址匹配
\d+\.\d+\.\d+\.\d+\.
//IPv4格式为四段数字+.隔开(数字.数字.数字.数字)
//\d+表示任意数字;\.用来转义.
//但是IP地址范围是0-255,此表达式并不会限定范围
改进算法
\b(25[0-5]|2[0-4]\d|[01]?\d\d?.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b
//解释: 1.如果第一位为25,则最后一位只能取0-5
// 2.如果第一位为2,第二位能取0-4,第三位是任意值
// 3.如果第一位是01,后续两位能取任意值,同时IP地址可以由1-3为数字构成,即第一、第三位数字可以省略
//用或符号|进行连接
//{3}表示内容重复3次;但是由于最后一段不包含.,需要单独匹配
//前后加上\b用来确定边界
七、表达式格式总结![](https://i-blog.csdnimg.cn/blog_migrate/3f44d682a32ac04cf354ce68c6b1e259.png)
八、正则表达式在C#中的应用
首先需要引入组件
using System.Text.RegularExpressions
简单的匹配方法
IsMatch(String, String); | 否找到了匹配项 |
Match(String, String) | 找到第一个匹配项 |
Matches(String, String) | 找到所有匹配项 |
Replace(String, String) | 用指定字符串替换匹配项 |
Split(String, String) | 按指定条件拆分字符串 |
匹配测试代码
List<string> StrList = new List<string>();
StrList.Add("abcd");
StrList.Add("Abcd");
StrList.Add("Ab12");
StrList.Add("1234");
//用于测试的容器
string RegeX = "^[a-z]+$"; //全部匹配
foreach (var item in StrList)
{
if (Regex.IsMatch(item, RegeX) == true)
Console.WriteLine(item + " 是纯小写");
else
Console.WriteLine(item + " 不是纯小写");
}
Console.WriteLine();
RegeX = @"\d+"; //包含匹配
foreach (var item in StrList)
{
if (Regex.IsMatch(item, RegeX) == true)
Console.WriteLine(item + " 包含数字");
else
Console.WriteLine(item + " 不包含数字");
}
Console.WriteLine();
RegeX = @"^Ab[\w\W]*"; //开头匹配
foreach (var item in StrList)
{
if (Regex.IsMatch(item, RegeX) == true)
Console.WriteLine(item + " 以Ab开头");
else
Console.WriteLine(item + " 不是以Ab开头");
}
Console.WriteLine();