正则表达式
简介
正则表达式(Regular Expression,常简写为regex、regexp或RE),使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
在编写处理字符串的时候,经常会有查找符合某些复杂规则字符串的需要,例如,查找字符串中的数字、电话号码等。正则表达式就是用于描述这些规则的工具,就是一种记录文本规则的代码。
基本语法
一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列匹配某个句法规则的字符串。例如:Handel、Händel和Haendel这三个字符串,都可以由H(a|ä|ae)ndel
这个模式来描述。大部分正则表达式的形式都有如下的结构:
1、选择
- 竖线
|
代表选择(或集),具有最低优先级。例如gray|grey
可以匹配grey或gray。
2、数量限定
某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括+
、?
、*
和{}
(不加数量限定则代表出现一次且仅出现一次):
- 加号
+
代表前面的字符必须至少出现一次。(1次或多次)。例如,goo+gle
可以匹配google、gooogle、goooogle等 - 问号
?
代表前面的字符最多只可以出现一次。(0次或1次)。例如,colou?r
可以匹配color或者colour - 星号
*
代表前面的字符可以不出现,也可以出现一次或者多次。(0次、1次或多次)。例如,0*42
可以匹配42、042、0042、00042等。 - 花括号
{}
代表重复的次数。{n}
重复n次。{n,}
重复n次或更多次。{n,m}
重复n到m次。
3、匹配
- 圆括号
()
可以用来定义操作符的范围和优先度。例如,gr(a|e)y
等价于gray|grey
,(grand)?father
匹配father和grandfather。
上述这些构造子都可以自由组合,因此H(ae?|ä)ndel
和H(a|ae|ä)ndel
是相同的。
精确的语法可能因不同的工具或程序而异。
元字符
常用的元字符:
.
匹配除换行符以外的任意字符
\w
匹配字母或数字或下划线或汉字
\s
匹配任意的空白符
\d
匹配数字
\b
匹配单词的开始或结束
^
匹配字符串的开始
$
匹配字符串的结束
例子:
1、\ba\w*\b
匹配以字母a开头的单词,先是某个单词开始\b
,然后是字母a,然后是任意数量的字母或数字\w*
,最后是单词结束处\b
。
2、^\d{5,12}$
匹配5位到12位数字,{5,12}
重复的次数不能少于5次,不能多于12次,否则都不匹配。
使用了^
和$
,整个字符串都要用来和\d{5,12}
来匹配,整个字符串必须是5到12个数字。
3、Windows\d+
匹配Windows后面跟1个或更多数字
4、^\w+
匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)
有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项,^和$的意义就变成了匹配行的开始处和结束处。
字符转义
如果想查找元字符本身的话,比如你查找.
,或者*
,这时你就得使用\
来取消这些字符的特殊意义,\.
\*
。要查找\
本身,也得用\\
.
例如:
deerchao\.net
匹配 deerchao.net
C:\\Windows
匹配 C:\Windows
。
字符类
当匹配没有预定义元字符的字符集合只需要在方括号里列出它们就行了,像[aeiou]
就匹配任何一个英文元音字母,[.?!]
匹配标点符号(.或?或!)。
也可以指定一个字符范围,像[0-9]
代表的含意与\d
就是完全一致的:一位数字。
同理[a-z0-9A-Z_]
也完全等同于\w
(如果只考虑英文的话)。
\(?0\d{2}[) -]?\d{8}
可匹配几种格式的电话号码,(010)88886666,或022-22334455,或02912345678等。
首先是一个转义字符\(
,它能出现0次或1次?
,然后是一个0,后面跟着2个数字\d{2}
,然后是)
或-
或空格中的一个,它出现1次或不出现?
,最后是8个数字\d{8}
。
有个问题就是,这个也能匹配,010)12345678或(022-87654321这样的“不正确”的格式。要解决这个问题,需要用到分枝条件。
分支条件
正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}
这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。
\d{5}-\d{4}|\d{5}
这个表达式用于匹5位数字,或者用连字号间隔的9位数字。
使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}
的话,那么就只会匹配5位数字(以及9位数字前5位)。
因为匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
常用正则表达式
用户名 /^[a-z0-9_-]{3,16}$/
密码 /^[a-z0-9_-]{6,18}$/
十六进制值 /^#?([a-f0-9]{6}|[a-f0-9]{3})$/
电子邮箱 /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/
URL /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
IP 地址 /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
HTML 标签 /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/
Unicode编码中的汉字范围 /^[\u2E80-\u9FFF]+$/
Reference
http://deerchao.net/tutorials/regex/regex.htm
https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
http://tool.oschina.net/uploads/apidocs/jquery/regexp.html