forked from linux985/linux985.github.io
-
Notifications
You must be signed in to change notification settings - Fork 1
regular_expression
linux211 edited this page Apr 23, 2017
·
2 revisions
常见的正则表达式解读释义
又名:写给正在学习前端的女友看的常见正则表达式解读。原文发布于 [regular_expression](https://www.zybuluo.com/wddpct/note/728081) 。
1. 归纳定义
2. 保留字符
2.1 常用的元字符
2.2 常用限定符
2.3 常用的反义词
2.4 懒惰限定符
2.5 常用分组语法
3. 常用正则表达式
1. 匹配中文字符
2. 匹配双字节字符
3. 匹配空白行
4. 匹配Email地址
5. 匹配URL
6. 匹配国内电话号码
7. 匹配腾讯qq号
8. 匹配中国邮政编码
9. 匹配18位身份证
10. 匹配正整数
11. 匹配整数
12. 匹配非负整数
13. 匹配正浮点数
1. 归纳定义
对给定的字符集:Σ={c1,c2,c3,……,cn}
空串ε是一个正则表达式
对于任何的c∈Σ,c是正则表达式
如果M和N都是正则表达式,则以下也是正则表达式
选择 M|N = {M,N}
连接 MN = {mn,m∈M,n∈N}
2. 保留字符
这节中的表格内容来自 正则表达式30分钟入门教程,对此表示感谢。
2.1 常用的元字符
代码
说明
.
匹配除换行符以外的任意字符
\w
匹配字母或数字或下划线
\s
匹配任意的空白符
\d
匹配数字
\b
匹配单词的开始或结束
^
匹配字符串的开始
$
匹配字符串的结束
2.2 常用的限定符
代码/语法
说明
*
重复零次或更多次
+
重复一次或更多次
?
重复零次或一次
{n}
重复n次
{n,}
重复n次或更多次
{n,m}
重复n到m次
2.3 常用的反义词
代码/语法
说明
\W
匹配任意不是字母,数字,下划线,汉字的字符
\S
匹配任意不是空白符的字符
\D
匹配任意非数字的字符
\B
匹配不是单词开头或结束的位置
[^x]
匹配除了x以外的任意字符
[^aeiou]
匹配除了aeiou这几个字母以外的任意字符
2.4 懒惰限定符
代码/语法
说明
*?
重复任意次,但尽可能少重复
+?
重复1次或更多次,但尽可能少重复
??
重复0次或1次,但尽可能少重复
{n,m}?
重复n到m次,但尽可能少重复
{n,}?
重复n次以上,但尽可能少重复
2.5 常用分组语法
代码/语法
说明
(exp)
匹配exp,并捕获文本到自动命名的组里
(?< name >exp)
匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)
匹配exp,不捕获匹配的文本,也不给此分组分配组号
(?=exp)
匹配exp前面的位置
(?<=exp)
匹配exp后面的位置
(?!exp)
匹配后面跟的不是exp的位置
(?< !exp)
匹配前面不是exp的位置
(?#comment)
这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
3. 常用正则表达式
1. 匹配中文字符
正则表达式:[\u4e00-\u9fa5]
说明:目前主流计算机底层的编码系统都是Unicode,而在Unicode标准中,汉字表的第一个编码为U+4e00,最后一个编码为U+9fa5,所以[\u4e00-\u9fa5]就代表匹配任意一个Unicode编码表中存在的汉字。
2.匹配双字节字符
正则表达式:[^\x00-\xff]
说明:\x代表十六进制形式,2个字节长度的十六进制最大范围为00-ff,所以[^\x00-\xff]表示匹配长度为双字节的字符。
3. 匹配空白行
正则表达式:\n\s*\r
说明:这个表达式表示匹配内容中的空白行,比如一个txt由多行文字组成,并且句子与句子之间存在空白行,这个正则表达式便能加以区分。
首先,\n表示匹配一个换行符,而\s*代表匹配任意的空白符,\r表示匹配任意的回车符。
示例如下。
public class Program
{
static void Main(string[] args)
{
string[] sentences =
{
@"C# code
",
@"Chapter 2:
Writing Code",
@"Unicode",
@"match
here"
};
string sPattern = @"\n\s*\r";
foreach (string s in sentences)
{
if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
{
System.Console.WriteLine(" (match for '{0}' found)", s);
}
else
{
System.Console.WriteLine();
}
}
}
}
4. 匹配Email地址
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
示例:wddpct@gmail.com,wdd.pct@gmail.com,wddpct-pct@gmail.com
5. 匹配URL
正则表达式:[a-zA-Z]+:\/\/[^\s]*
说明:[a-zA-Z]+表示匹配任意长度字符串,并且字符串包含的字符只能是a和z或者A和Z之间的字母。‘:\/\/’表示匹配“://”字符串。[^\s]*表示匹配任意长度的不包含非空字符的字符串。
当然了,日常生活中见到的网址URL大多以http或https开头,所以匹配以http或者https开发的网址也十分简单,笔者随手写了两个以供参考,比如 (http|https)://[^\s]*或者http[s]?://[^\s]*。
6. 匹配国内电话号码
正则表达式:\d{3}-\d{8}|\d{4}-\d{7,8}
说明:‘|’将匹配条件分为两部分。\d{3}-\d{8}代表匹配xxx-xxxxxxxx数字形式的号码。右边的\d{4}-\d{7,8}代表匹配xxxx-xxxxxxx或者xxxx-xxxxxxxx数字形式的号码。
示例:0577-12345678
7. 匹配腾讯qq号
正则表达式:[1-9][0-9]{4,}
说明:这个正则EXP十分容易理解,[1-9]表示匹配QQ号首位不为零的任意数字,[0-9]{4,}表示匹配从第二位开始最小长度为4的任意数字的字符串。
示例:1242450501
8. 匹配中国邮政编码
正则表达式:[1-9]\d{5}(?!\d)
说明:[1-9]表示匹配不为零的任意数字,(?!)表示零宽断言的一种语法,又称零宽度负预测先行断言,表示位置的后面不能匹配表达式,所以\d{5}(?!\d)表示匹配5位数字,而且这5位数字的后面不能是数字。
示例:325800,325800编码
9. 匹配18位身份证
正则表达式:^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$
说明:这段正则虽然很长,其实表达的意思也非常简单。\d{6}代表匹配6位数字,\d{4}代表匹配4位数字,\d{2}代表匹配2位数字,\d{3}代表匹配3位数字,最后的[0-9]|X代表匹配0到9的任意数字,或者匹配X字母,正巧,笔者的身份证最后一位就是X。
示例: 65900719951006773X
10. 匹配正整数
正则表达式:^[1-9]\d*$
说明:[1-9]表示首位匹配1到9的任意数字,\d*代表从第二位开始可以为空,不为空时必须为数字。由此正则推广开来,匹配负整数的表达式格式应该为 ^-[1-9]\d*$ 。
11. 匹配整数
正则表达式:^-?[1-9]\d*$
说明:后面的[1-9]\d*和匹配正整数的表达式一致,所以只要看懂-?代表整数的符号位可以有‘-’即可。
12. 匹配非负整数
正则表达式:^[1-9]\d*|0$
说明:[1-9]\d*和匹配正整数的表达式一致,|0表示可为0。同理,表示非正整数的表达式应该是 ^-[1-9]\d*|0$ 。
13. 匹配正浮点数
正则表达式:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
说明:[1-9]\d*\.\d*代表匹配格式形如“正整数.数字”的字符串,0\.\d*[1-9]\d*$ 代表匹配格式形如“0.数字”的字符串。中间用|代表或条件。所以同理,匹配负浮点数的正则为^-[1-9]\d*\.\d*|-0\.\d*[1-9]\d*$