正则简介:
说明: RegExp属于引用类型,引用类型是一种数据结构,用于将数据和功能组织在一起,如var newRegExp = new RegExp(),这行代码创建了RegExp引用类型的一个新实例,保存在newRegExp中,使用的构造函数是RegExp,它只为新对象定义了默认的属性和方法.
创建正则:
模式修饰 | 修饰说明 |
i | 忽略大小写 |
g | 全局匹配 |
m | 多行匹配 |
/* * 创建正则对象 */ // - 第一种方式: 使用new关键字创建,支持修饰模式指定 var regExp = new RegExp('pattern') var regExp = new RegExp('pattern', 'igm') // - 第二种方式: 使用//符号创建,支持修饰模式指定 var regExp = /pattern/igm
正则测试:
说明: RegExp对象测试常用.test()和.exec(),两者都是用正则表达式去匹配字符串,但前者如果匹配到则返回true,否则返回false,后者如果匹配返回匹配字符串的相关信息数组,否则返回null
var strs = 'I Love You' // 测试 - 使用new运算符的test方法 var pattern = new RegExp('love', 'i') if(pattern.test(strs)) console.log('匹配') // 测试 - 使用字面量方式test方法 var pattern = /love/i if(pattern.test(strs)) console.log('匹配') // 测试 - 一条语句实现正则表达式匹配 if(/love/i.test(strs)) console.log('匹配') // 测试 - 使用exec测试返回匹配信息数组 if(/love/i.test(strs)) console.log(/love/i.exec(strs))
获取控制:
说明: 正则表达式元字符是包含特殊意义的字符,它们有一些特殊功能,可以控制匹配模式的方式,反斜杠后的元字符将失去其特殊含义
元字符/元符号 | 匹配情况 |
字符类:单个字符和数字 | |
. | 匹配除换行符外的任意字符 |
[a-z0-9] | 匹配括号中的字符集中的任意字符 |
[^a-z0-9] | 匹配任意不在括号中的字符集中的字符 |
\d | 匹配数字 |
\D | 匹配非数字,同[^0-9]相同 |
\w | 匹配字母和数字及_ |
\W | 匹配非字母和数字及_ |
字符类:空白字符 | |
\0 | 匹配 null 字符 |
\b | 匹配空格字符 |
\f | 匹配进纸字符 |
\n | 匹配换行符 |
\r | 匹配回车字符 |
\t | 匹配制表符 |
\s | 匹配空白字,空格,制表符和换行符 |
\S | 匹配非空白字符 |
字符类:锚字符 | |
^ | 行首匹配 |
$ | 行尾匹配 |
\A | 只有匹配字符串开始处 |
\b | 匹配单词边界,词在[]内时无效 |
\B | 匹配非单词边界 |
\G | 匹配当前搜索的开始位置 |
\Z | 匹配字符串结束处或行尾 |
\z | 只匹配字符串结束处 |
字符类:重复字符 | |
x? | 匹配 0 个或 1 个 x |
x* | 匹配 0 个或任意多个 x |
x+ | 匹配至少一个 x |
(xyz)+ | 匹配至少一个(xyz) |
x{m,n} | 匹配最少 m 个、最多 n 个 x |
字符类:替代字符 | |
this|where|logo | 匹配 this 或 where 或 logo 中任意一个 |
字符类:记录字符 | |
(string) | 用于反向引用的分组 |
\1 或$1 | 匹配第一个分组中的内容 |
\2 或$2 | 匹配第二个分组中的内容 |
\3 或$3 | 匹配第三个分组中的内容 |
/* * 使用点元字符 */ var pattern = /g..gle/ var str = 'google' console.log(pattern.exec(str)) /* * 使用重复匹配 */ var pattern = /g.*gle/ var str = 'google' console.log(pattern.exec(str)) /* * 使用字符类匹配 */ var pattern = /g[a-zA-Z_]*gle/ var str = 'google' console.log(pattern.exec(str)) var pattern = /g[^0-9]*gle/ var str = 'google' console.log(pattern.exec(str)) var pattern = /[a-z][A-Z]+le/ var str = 'gOOGle' console.log(pattern.exec(str)) /* * 使用元符号匹配 */ var pattern = /g\w*gle\d*/ var str = 'google35' console.log(pattern.exec(str)) var pattern = /\D{6,}/ var str = 'google35' console.log(pattern.exec(str)) /* * 使用锚元字符匹配 */ var pattern = /^google$/ var str = 'google' console.log(pattern.exec(str)) var pattern = /^goo\sgle$/ var str = 'goo gle' console.log(pattern.exec(str)) var pattern = /\bgoogle\b/ var str = 'use google happy' console.log(pattern.exec(str)) /* * 使用或模式匹配 */ var pattern = /baidu|google|soso/ var str = 'google' console.log(pattern.exec(str)) /* * 使用分组模式匹配 */ var pattern = /(google){3,}/ var str = 'googlegooglegooglegoogle' console.log(pattern.exec(str)) var pattern = /8(.*)8/ var str = '8google8' console.log(pattern.exec(str)) var pattern = /8(.*)8/ var str = '8google8' console.log(str.replace(pattern, '$1')) var pattern = /(.*)\s(.*)/ var str = 'baidu google' console.log(str.replace(pattern, '$2 $1'))
贪婪模式 | 惰性模式 |
+ | +? |
? | ?? |
* | *? |
{n} | {n}? |
{n,} | {n,}? |
{n,m} | {n,m}? |
/* * 关于贪婪和惰性 */ var pattern = /[a-z]+?/ var str = 'abcdefjhijklmnopqrstuvwxyz' console.log(str.replace(pattern, 1)) var pattern = /8(.+?)8/g var str = 'This is 8google8, That is 8google8, There is 8google8' console.log(pattern.exec(str)) var pattern = /8[^8]*8/g var str = 'This is 8google8, That is 8google8, There is 8google8' console.log(pattern.exec(str)) /* * 捕捉性分组和非捕捉性分组 */ var pattern = /(\d+)([a-z]+)/ var str = '123abc' console.log(pattern.exec(str)) var pattern = /(\d+)(?:[a-z]+)/ var str = '123abc' console.log(pattern.exec(str)) /* * 使用分组嵌套 */ var pattern = /(A?(B?(C?)))/ var str = 'ABC' console.log(pattern.exec(str)) /* * 使用前瞻捕捉 */ var pattern = /(goo(?=gle))/ var str = 'google' console.log(pattern.exec(str)) /* * 使用换行模式 */ var pattern = /^\d(\.\w+)$/mg var str = '1.baidu\n\n\n2.google\n\n\n3.soso' console.log(str.replace(pattern, '#$1'))
其它相关:
说明: String字符串对象也提供了4个使用正则表达式的方法
对象方法 | 方法说明 |
.match(pattern) | 返回pattern中的子串或null |
.replace(pattern, replacement) | 用replacement替换pattern |
.search(pattern) | 返回字符串中pattern开始位置 |
.split(pattern) | 返回字符串按照指定pattern拆分的数组 |
// 字符串对象匹配方法 - match,获取匹配数组 var strs = 'I Love You, i love you' console.log(strs.match(/love/ig)) // 字符串对象匹配方法 - search,找到就返回位置,所以g修饰符无用,未找到返回-1 console.log(strs.search(/love/ig)) // 字符串对象匹配方法 - replace,替换匹配的数据 console.log(strs.replace(/love/ig, '爱')) // 字符串对象匹配方法 - split,用匹配的数据分割字符串为数组 console.log(strs.split(/love/ig))
常用正则:
// 检查邮政编码 var pattern = /[1-9][0-9]{5}/ var str = '442700' console.log(pattern.test(str)) // 检查文件压缩包 var pattern = /\w+\.(zip|rar|gz)/ var str = 'xmdevops-agent.zip' console.log(pattern.test(str)) // 删除多余的空格 var pattern = /\s/g var str = 'xx oo xx' console.log(str.replace(pattern, '')) // 删除首尾空格 var pattern = /^\s+/ var str = ' xx oo xx ' console.log(str.replace(pattern, '')) var pattern = /\s+$/ var str = ' xx oo xx ' console.log(str.replace(pattern, '')) var pattern = /^\s+(.+?)\s+/ var str = ' xxooxxoo ' console.log(str.replace(pattern, '$1')) // 电子邮件验证 var pattern = /^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/; var str = '[email protected]'; alert(pattern.test(str)); var pattern = /^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/; var str = '[email protected]'; alert(pattern.test(str));