正则表达式全解析+常⽤⽰例
在开始写这篇⽂章之前,我的⼼⾥还是纠结的。我在问⾃⼰要不要写这篇东西,关于相似的内容⽹上多如⽜⽑,⽽且还不乏珍品,况且,就算我写了也不⼀定能写的好。但是现在你既然看到了,那说明我还是写了出来。就算是对⾃⼰学习的⼀个总结吧!同时也把常见的常⽤的正则表达式给收集整理出来,以便⽤到的时候不⽤满世界的。
关于正则表达式⼀直都是个让很多程序员都觉得很郁闷的⼀个东西,我觉得创造正则表达式的那个家伙简直就是个奇葩,要不就是⽕星⼈。就那么⼀个字符规则校验就⾜以使那么多程序员为之抓狂,你可以想象这个东西该有多变态。这篇⽂章,我写了四个⼩时,就在快要写完的时候,因为要参考其他的⽂献资料,不⼩⼼按到了回退键,可怕的是我还没有保存,我很抓狂,真的很抓狂,甚⾄有点⼩失控。好吧,我不淡定了,既然是这样,那这个东西我是必然要写出来的。
由于本⼈⽔平有限,不可能写的那么全⾯,只是把⽐较实⽤的东西给写下来,还有对⼀些常⽤的正则表达式进⾏收集整理,如果有写的不对的地⽅,还希望各路⼤⽜多多指教!
废话不多说,开始进⼊正题。
正则表达式简介
正则表达式是由⼀些具有特殊含义的字符组成的字符串,多⽤于查、替换符合规则的字符串。在表单验证、Url映射等处都会经常⽤到。
⼀、元字符
元字符:即为有特定含义的字符,常见的元字符如下
常⽤的元字符
代码说明
.匹配除换⾏符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空⽩符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始(在集合字符⾥[^a]表⽰⾮(不匹配)的意思
$匹配字符串的结束
详解和⽰例:
(1). 匹配任何任意字符    例如 .  可以匹配 1,n,*,+,- ,等
(2)\d\w\s    匹配第⼀个字符为数字,第⼆个字符为字母或数字、或下划线或汉字,第三字符为空格的字符串 例如:11  ,2a  , 1_
(3)^\d\d\d$ 匹配三个全部都为数字的字符串  例如: 123,456,789
还可以⽤于验证输⼊的字符串是否符合qq(⾝份证号)的验证 :
例如:^\d{8}$ 匹配8位数字的qq号,^\d{15}&匹配15位均为数字的⾝份证号
(4)\bOlive\b 匹配单词Olive 例如: I Love Oliver and Olive .这个时候返回的是Olive ⽽不是Oliver,因为\b....\b返回的匹配的单词
⼆、反义字符
反义字符:多⽤于查除某个字符以外其他任意字符均可以的情况
常⽤的反义字符如下:
常⽤的反义字符
代码/语法说明
\W匹配任意不是字母,数字,下划线,汉字的字符
代码/语法说明
\S匹配任意不是空⽩符的字符
\D匹配任意⾮数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这⼏个字母以外的任意字符
详解和⽰例:
(1)\W    匹配除字母、数字、下划线、汉字以为的字符形如  +,-,*
(2)\S    匹配除空格以外的任意字符形如:1,* ,)
(3)[^abcde]匹配除abcde以为的其他字符 如  e,f,g,h
三、限定字符
限定字符多⽤于重复匹配次数
常⽤的限定字符如下
常⽤的限定符
代码/语法说明
*重复零次或更多次
+重复⼀次或更多次
重复零次或⼀次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
详解和⽰例:
(1)\d*  匹配重复0次或多次数字  例如:可能为空 或 任意数字 (2,3。。。。)
(2)\d+ 匹配重复1次或多次数字    例如:可能为1个或多个数字 1,23,234,2345,........
(3)\d? 匹配重复次个或者⼀次数字  例如:可能为空或者任意的⼀个数字(1,2,。。。)
(4)\d{8}匹配重复8次数字    例如:123456768
(5)\d{4,}匹配重复⾄少4次数字 例如:1234,12345,124244,。。。。。
(6)^\d{8,11}$ 匹配重复8-11次数字 例如:12345678,123456789,1234567890,12345678901
四、转义字符
在实际的开发中,可能会遇到要⽐配元字符的情况,这个时候就需要进⾏字符转义,如元字符 .  *  \ 需要转换为\.  \*  \\
例如: 需要匹配qq邮箱 \d{8,}+qq+\.+com  在这⾥的. 就需要加斜杠
五、字符分枝
字符分枝多⽤于满⾜不同情况的选择,⽤“|”将不同的条件分割开来,⽐如有些固定电话区号有三位,有些有四位,这个时候可以采⽤字符分枝
例如:\d{3}-\d{8}|\d{4}-\d{8}  可以匹配两种不同长度区号的固定电话
下边的IP地址正则表达式也有⽤到字符分枝
六、字符分组
字符分组多⽤于将多个字符重复,主要通过使⽤⼩括号()来进⾏分组
形如:(\d\w){3} 重复匹配3次(\d\w)
常⽤于表⽰IP地址  形如: ((25[0-5]|2[0-4][0-9]|[0-1]\d\d)\.){3}(25[0-5]|2[0-4][0-9]|[0-1]\d\d)
解析:先把IP地址分为两部分⼀部分是123.123.123. 另⼀部分是123,⼜因Ip最⼤值为255,所以先使⽤分组,然后在组⾥边再进⾏选择,组⾥也有三部分,0-199,200-249,250-255,分别和上述的表达是对应,最后还要注意分组之后还要加上⼀个.,因为是元字符所以要转义故加上\. 然后再把这部分整体看做是⼀个组,重复三次,再加上仅有数字的⼀组也就是不带\.的那⼀组即可完成IP地址的校验
常⽤分组语法
⽤分组语法
分类代码/语法说明
捕获(exp)匹配exp,并捕获⽂本到⾃动命名的组⾥
(?<name>exp)匹配exp,并捕获⽂本到名称为name的组⾥,也可以写成(?'name'exp) (?:exp)匹配exp,不捕获匹配的⽂本,也不给此分组分配组号
零宽断⾔(?=exp)匹配exp前⾯的位置
(?<=exp)匹配exp后⾯的位置
(?!exp)匹配后⾯跟的不是exp的位置(?<!exp)匹配前⾯不是exp的位置
注释(?#comment)这种类型的分组不对正则表达式的处理产⽣任何影响,⽤于提供注释让⼈阅读
七、懒惰匹配和贪婪匹配
贪婪匹配:正则表达式中包含重复的限定符时,通常的⾏为是匹配尽可能多的字符。
懒惰匹配,有时候需要匹配尽可能少的字符。
例如: a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果⽤它来搜索aabab的话,它会匹配整个字符串aabab。但是我们此时可能需要匹配的是ab这样的话就需要⽤到懒惰匹配了。懒惰匹配会匹配尽可能少的字符
常⽤的懒惰匹配限定符如下
懒惰限定符
代码/语法说明
*?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复
⼋、后向引⽤
后向引⽤⽤于重复搜索前⾯某个分组匹配的⽂本。
使⽤⼩括号指定⼀个⼦表达式后,匹配这个⼦表达式的⽂本(也就是此分组捕获的内容)可以在表达式或其它程序中作进⼀步的处理。默认情况下,每个分组会⾃动拥有⼀个组号,规则是:从左向右,以分组的左括号为标志,第⼀个出现的分组的组号为1,第⼆个为2,以此类推
⽰例:\b(\w+)\b\s+\1\b可以⽤来匹配重复的单词,像go go, 或者kitty kitty。
这个表达式⾸先是⼀个单词,也就是单词开始处和结束处之间的多于⼀个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或⼏个空⽩符(\s+),最后是分组1中捕获的内容(也就是前⾯匹配的那个单词)(\1)。
你也可以⾃⼰指定⼦表达式的组名。要指定⼀个⼦表达式的组名,请使⽤这样的语法:(?<Word>\w+)(或者把尖括号换成'也
⾏:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引⽤这个分组捕获的内容,你可以使⽤\k<Word>,所以上⼀个例⼦也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b
九、零宽断⾔
有时候需要查某些匹配之前或之后的东西,这个时候就需要⽤到们像\b,^,$那样⽤于指定⼀个位置,这个位置应该满⾜⼀定的条件(即断⾔),因此它们也被称为零宽断⾔
(?=exp)也叫零宽度正预测先⾏断⾔,它断⾔⾃⾝出现的位置的后⾯能匹配表达式exp。⽐如\b\w+(?=ing\b),匹配以ing结尾的单词的前⾯部分(除了ing以外的部分),如查I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断⾔,它断⾔⾃⾝出现的位置的前⾯能匹配表达式exp。⽐如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查reading a book时,它匹配ading。
⼗、其他语法
.NET常⽤的处理选项
名称说明
IgnoreCase(忽略⼤⼩写)匹配时不区分⼤⼩写。
Multiline(多⾏模式)更改^和$的含义,使它们分别在任意⼀⾏的⾏⾸和⾏尾匹配,⽽不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
Singleline(单⾏模式)更改.的含义,使它与每⼀个字符匹配(包括换⾏符\n)。
IgnorePatternWhitespace(忽
略空⽩)
忽略表达式中的⾮转义空⽩并启⽤由#标记的注释。ExplicitCapture(显式捕获)仅捕获已被显式命名的组。
其他语法
代码/语法说明
\a报警字符(打印它的效果是电脑嘀⼀声)
\b通常是单词分界位置,但如果在字符类⾥使⽤代表退格
\t制表符,Tab
\r回车
\v竖向制表符
\f换页符
\n换⾏符
\e Escape
\0nn ASCII代码中⼋进制代码为nn的字符
\xnn ASCII代码中⼗六进制代码为nn的字符
\unnnn Unicode代码中⼗六进制代码为nnnn的字符
\cN ASCII控制字符。⽐如\cC代表Ctrl+C
\A字符串开头(类似^,但不受处理多⾏选项的影响)
\Z字符串结尾或⾏尾(不受处理多⾏选项的影响)
\z字符串结尾(类似$,但不受处理多⾏选项的影响)
代码/语法说明
\G当前搜索的开头
\p{name}Unicode中命名为name的字符类,例如\p{IsGreek}
(?>exp)贪婪⼦表达式
(?<x>-<y>exp)平衡组
(?im-nsx:exp)在⼦表达式exp中改变处理选项
(?im-nsx)为表达式后⾯的部分改变处理选项
(?(exp)yes|no)把exp当作零宽正向先⾏断⾔,如果在这个位置能匹配,使⽤yes作为此组的表达式;否则使⽤no
(?(exp)yes)同上,只是使⽤空表达式作为no
(?(name)yes|no)如果命名为name的组捕获到了内容,使⽤yes作为表达式;否则使⽤no
(?(name)yes)同上,只是使⽤空表达式作为no
⼗⼀、常⽤的实⽤正则表达式整理(摘⾃⾃学编程⽹)
只能输⼊数字:"^[0-9]*$"。
  只能输⼊n位的数字:"^"d{n}$"。
  只能输⼊⾄少n位的数字:"^"d{n,}$"。
  只能输⼊m~n位的数字:。"^"d{m,n}$"
  只能输⼊零和⾮零开头的数字:"^(0|[1-9][0-9]*)$"。
  只能输⼊有两位⼩数的正实数:"^[0-9]+(.[0-9]{2})?$"。
  只能输⼊有1~3位⼩数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
  只能输⼊⾮零的正整数:"^"+?[1-9][0-9]*$"。
  只能输⼊⾮零的负整数:"^"-[1-9][]0-9"*$。
  只能输⼊长度为3的字符:"^.{3}$"。
  只能输⼊由26个英⽂字母组成的字符串:"^[A-Za-z]+$"。
  只能输⼊由26个⼤写英⽂字母组成的字符串:"^[A-Z]+$"。
  只能输⼊由26个⼩写英⽂字母组成的字符串:"^[a-z]+$"。
  只能输⼊由数字和26个英⽂字母组成的字符串:"^[A-Za-z0-9]+$"。
  只能输⼊由数字、26个英⽂字母或者下划线组成的字符串:"^"w+$"。
  验证⽤户密码:"^[a-zA-Z]"w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。  验证是否含有^%&’,;=?$""等字符:"[^%&’,;=?$"x22]+"。
  只能输⼊汉字:"^["u4e00-"u9fa5]{0,}$"
  验证Email地址:"^"w+([-+.]"w+)*@"w+([-.]"w+)*"."w+([-.]"w+)*$"。
  验证电话号码:"^("("d{3,4}-)|"d{3.4}-)?"d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
  验证⾝份证号(15位或18位数字):"^"d{15}|"d{18}$"。regex匹配
  验证⼀年的12个⽉:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。