什么是正则表达式
正则表达式是一个描述字符模式的对象。主要用来验证客户端的输入数据,用户填写完表单信息提交后,就会传递给后台服务器,服务器会通过PHP等后台脚本进行处理,因为客户端验证,节约了大量的服务器资源,并提供了良好的用户体验。
创建正则表达式
创建正则表达式有两种方法:
使用RegExp构建函数接收两个参数:一个是要匹配的字符串,一个是模式修饰符(可选)
var pattern = new RegExp('box');字面量方式创建,直接使用两个斜杠。在第二个斜杠后面加上模式修饰符(可选)
var pattern = /box/ flags;//两个斜杠和box之间不能有空格
| 参数 | 含义 |
|---|---|
| g | 全局模式(global) |
| i | 不区分大小写(case-insensitive) |
| m | 多行模式(multiline) |
模式修饰符的可选参数:
| 参数 | 含义 |
|---|---|
| g | 全局模式(global) |
| i | 不区分大小写(case-insensitive) |
| m | 多行模式(multiline) |
测试正则表达式
exct() 接收一个参数,该参数和模式匹配,把模式作为数组返回;未匹配到返回null
test() 接收一个参数,该参数和模式匹配,返回true,否则返回false
使用字符串的正则表达式方法
String对象中的正则表达式方法:
| 方法 | 含义 |
|---|---|
match(pattern) |
返回匹配到模式中的字符串或null
|
replace(pattern,replacement) |
用replacement替换pattern
|
search(pattern) |
返回字符串中pattern开始的位置 |
split(pattern) |
返回用空格拆分的数组 |
例:
var pattern = /box/ig;
var str = "This is Box! This is Box!";
alert(str.match(pattern)); //Box Box
开启全局模式,将所有匹配的字符串组合成数组;
未开启全局模式,匹配到第一个字符串就返回。
var pattern = /box/ig;
var str = "This is Box! This is Box!";
alert(str.replace(pattern,'Tom')); //This is Box! This is Box!
开启全局模式,将匹配到的字符串全部替换掉;
未开启全局模式,只替换掉第一个查找到的字符串。
var pattern = /box/i;
var str = "This is Box! This is Box!";
alert(str.search(pattern)); //8
查找返回的位置:查到返回对应的位置,未查到返回-1;无需全局模式。
var pattern = / /i;
var str = "This is Box! This is Box!";
alert(str.split(pattern));
返回用空格拆分的数组
| 属性 | 短名 | 含义 |
|---|---|---|
| input | $_ | 当前被匹配的字符串 |
| lastMatch | $& | 最后一个匹配字符串 |
| lastParen | $+ | 最后一对圆括号内的匹配子串 |
| leftContext | $` | 最后一次匹配前的字符串 |
| multiline | $* | 用于指定是否所有的表达式都用于多行的,返回布尔值 |
| rightContext | $' | 最后一次匹配之后的字符串 |
RegExp对象的静态属性:
| 属性 | 短名 | 含义 |
|---|---|---|
| input | $_ | 当前被匹配的字符串 |
| lastMatch | $& | 最后一个匹配字符串 |
| lastParen | $+ | 最后一对圆括号内的匹配子串 |
| leftContext | $` | 最后一次匹配前的字符串 |
| multiline | $* | 用于指定是否所有的表达式都用于多行的,返回布尔值 |
| rightContext | $' | 最后一次匹配之后的字符串 |
所有的属性都可以用短名来操作,其中$_可以用点表示法来操作,其他都不可以。
正则表达式元字符是包含特殊含义的字符,可以控制匹配模式的方式。反斜杠后的元字符将失去其含义。
获取控制
字符类:单个字符和数字
| 元字符/元符号 | 匹配情况 |
|---|---|
| . | 匹配除换行符号外的任意字符 |
| [a-zA-Z0-9] | 匹配方括号中任意字符 |
| [^a-zA-Z0-9] | 匹配不是方括号中任意字符 |
| \d | 匹配任意数字和[0-9]相同 |
| \D | 匹配非数字和[^ 0-9]相同[^a-zA-Z0-9] |
| \w | 匹配字母和数字及_ |
| \W | 匹配非字母和数字及_ |
字符类:空白字符
| 元字符/元符号 | 匹配情况 |
|---|---|
| \0 | 匹配null字符 |
| \b | 匹配空格字符 |
| \f | 匹配进纸字符 |
| \n | 匹配换行符 |
| \r | 匹配回车字符 |
| \t | 匹配制表符 |
| \s | 匹配空白字符、空格、制表符和换行符 |
| \S | 匹配非空白字符 |
字符类:锚字符
| 元字符/元符号 | 匹配情况 |
|---|---|
| ^ | 行首匹配 |
| $ | 行尾匹配 |
| \A | 只有匹配字符串开始处 |
| \b | 匹配单词边界,词在[]内时无效 |
| \B | 匹配非单词边界 |
| \G | 匹配当前搜索的开始位置 |
| \Z | 匹配字符串结束处或行尾 |
| \z | 只匹配字符串结束处 |
字符类:重复字符
| 元字符/元符号 | 匹配情况 |
|---|---|
| x? | 匹配0个或1个x
|
| x* | 匹配0个或1个或多个x
|
| x+ | 匹配1个或多个x
|
| (xyz)+ | 匹配至少一个(xyz) |
| x{m,n} | 匹配最少m个、最多n个x
|
字符类:替代字符
| 元字符/元符号 | 匹配情况 |
|---|---|
| (string) | 分组表示一个字符,用圆括号表示 |
| \1 或$1 | 匹配第一个分组中的内容 |
| \2 或$2 | 匹配第二个分组中的内容 |
| \3 或$3 | 匹配第三个分组中的内容 |
贪婪和惰性(非贪婪)
贪婪是尽可能多的匹配内容,惰性(非贪婪)这是尽可能少的匹配内容
贪婪是从结尾开始匹配,惰性(非贪婪)是从开头开始匹配
| 贪婪 | 惰性 |
|---|---|
| + | +? |
| ? | ?? |
| * | *? |
| {n} | {n}? |
| {n,} | {n,}? |
| {n,m} | {n,m}? |
下面例子匹配8和8中的内容,把他替换成QQ
var pattern = /8(.+?)8/g;
var str = 'This is 8google8, That is 8google8, There is 8google8';
var result = str.replace(pattern,'QQ');
document.write(result);
输出结果:This is QQ, That is QQ, There is QQ
错误匹配:8google, That is 8换成QQ,google不变,8, There is 8替换成QQ,google8不变,就是我们看到的结果。
var pattern = /8(.+?)8/g;
var str = 'This is 8google, That is 8google8, There is 8google8';
var result = str.replace(pattern,'QQ');
document.write(result);
输出结果:This is QQgoogleQQgoogle8
错误匹配:8google8换成QQ,google不变,8, That is 8替换成QQ,google不变,8, There is 8替换成QQ,google8不变,就是我们看到的结果。
var pattern = /8(.+?)8/g;
var str = 'This is 8google8google8, That is 8google8, There is 8google8';
var result = str.replace(pattern,'>QQ');
document.write(result);
输出结果:This is QQgoogleQQgoogleQQgoogle8