regular expression: a pattern that strings can match
正则表达式就是匹配 目标字符串是一个subject,希望匹配的内容是一个pattern,利用正则,找出subject里匹配pattern的字符串
//eg: '*.txt' matches filename ending in '.txt'
//warning: notation is ugly
正则表达式基本语法:界定符,原子,量词,边界控制,模式单元
- 界定符:
表示一个RE的开始和结束/[0-9]/, 或者#[0-9]#, {[0-9]}(一般不用"{}"作为界定符)
regexpal 正则表达式实时调试工具
- 原子:
正则表达式中的最小匹配单位 【可以是Unicode编码表】分为可见原子和不可见原子
可见原子:Unicode编码表中用键盘输出后肉眼可见的字符
包含标点,英文字母数字,汉子,日文,阿拉伯文等其他语言,数理化公式符号,其他可见字符等
不可见原子: Unicode编码表中用键盘输出后肉眼不可见的字符
如:\n, \r, \t, 空格 以及其他不可见符号
可以利用regexpal来匹配调试,在匹配前,为了避免由于编码格式不同可能产生的问题,我们先用Unicode转换工具将pattern先转为Unicode再进行匹配
如果遇到re运算符(如“$”), 就在字符前面加上"\"进行转义
元字符
- 原子的筛选方式:“|” 匹配两个或更多;“[]”匹配"[]"内任意一个原子;“[^]”匹配方括号内原子之外的任意字符
[0-9a-zA-Z] 即匹配0-9或a-z或A-Z中任意字符
[^asdfe] 匹配所有非asdfe的字符
[Aa]pple,匹配apple或Apple
- 原子的集合
“.”匹配除换行符之外的任意字符,即[^\n]
“\d”匹配任意一个十进制数字,即[0-9]
“\D”匹配任意一个非十进制数字,即[^0-9]
“\s”匹配一个不可见原子,即[\f\n\r\t\v]
“\S”匹配一个可见原子,即[^\f\n\r\t\v]
“\w”匹配一个数字,字母或下划线,即[ [0-9a-zA-Z_]
“\W”匹配一个非数字,字母或下划线,即[ ^0-9a-zA-Z_]
- 量词
[查找在目标字符串中某一个原子连续出现多少次]
{n} 恰好n次
{n,} >=n次
{n,m} n<=?<=m次
"*" 匹配0次,1次或者多次,即{0}
"+" 匹配1次或者多次,即{1}
"?" 匹配0次,或者1次,即{0,1}
- 边界控制与模式单元
^匹配字符串开始位置
$ 匹配字符串结尾位置
() 匹配其中对整体为一个原子
修正模式
- 贪婪匹配(匹配结果存在歧义时取其长,通常默认是贪婪匹配)与懒惰匹配 (匹配结果存在歧义时取其短,在pattern后面加一个大写U)
- i - 忽略英文字母大小写
- x 忽略空白
- s 让元字符"."匹配包括换行符在内所有字符
- e
补充举例
.+ 非空:可以利用这个来判断用户是否已经输入内容,如果没有,可以提示用户表单是必填内容,否则无法提交。
\d+\.\d{2}$ 匹配两位小数的数字
1(3|4|5|7|8)\d{9}$ 匹配手机号
^\w+(\.\w+)*@\w+(\.\w+)+$ e-mail 地址验证匹配
^(https?://)?(\w+\.)+[a-zA-Z]+$ 匹配顶级域名链接
Ref: http://www.imooc.com/learn/350