正则表达式总结
正则表达式概述
- 什么是正则表达式?
- 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在JavaScript中,正则表达式也是对象。
- 正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本,例如表单验证:用户名表单只能输入英文字母、数字或者下划线,昵称输入框中可以输入中文(
匹配
)。此外,正则表达式还常用于过滤掉页面内容中的一些敏感词(替换
),或从字符串中获取我们想要的特定部分(提取
)等。 - 其他语言也会使用正则表达式,但是这主要是利用 JavaScript 正则表达式完成表单验证。
正则表达式的特点
- 灵活性、逻辑性和功能性非常强。
- 可以迅速的用极简单的方式达到字符串的复杂控制。
- 对于刚接触的人来说,比较晦涩难懂。比如:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
这是验证邮箱的表达式。
- 实际开发,一般都是直接复制写好的正则表达式。但是要求会使用正则表达式并且根据实际情况修改正则表达式。比如用户名:
/^[a-z0-9_-]{3,16}$/
3-16位用户名。
正则表达式在 JavaScript 中的使用
创建正则表达式
在 JavaScript 中,可以通过两种方式创建一个正则表达式。1. 通过调用 RegExp 对象的构造函数创建。
// 语法:var 变量名 = new RegExp(/表达式/) var regexp = new RegExp(/123/)
2. 通过字面量创建。
// 语法:var 变量名 = /表达式/ var rg = /123/
测试正则表达式 test
test()正则对象方法,用于检测字符串是否符合该规则,该对象会返回 true 或 false ,其参数是测试字符串。语法:regexobj.test(str)
- 主要作用:
- regexobj 是写的正则表达式。
- str 是我们要测试的文本。
- 就是检测 str 文本是否符合我们写的正则表达式规范。
正则表达式中的特殊字符
正则表达式的组成
- 一个正则表达式
可以由简单的字符构成
,比如 /abc/ ,也可以是简单和特殊字符的组合
,比如 /ab*c/ 。其中特殊字符也被称为元字符,在正则表达式中是具有特殊
意义的专用符号
,如 ^ 、$ 、+ 等。
- 特殊字符非常多,可以参考:
- MDN
- 正则测试工具
边界符
- 正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符。
边界符 | 说明 |
^ | 表示匹配行首的文本(以谁开始) |
$ | 表示匹配行尾的文本(以谁结束) |
- 正则表达式里面不需要加引号,不管是数字型还是字符串型。
- 如果 ^ 和 $ 在一起,表示必须是精确匹配。
- 如果中括号里面有 ^ ,表示取反的意思,千万和边界符 ^ 区分开。
var rg = /abc/ // /abc/ 只要包含有 abc 这个字符串返回的都是 true。 console.log(rg.test('abc')) console.log(rg.test('abcd')) console.log(rg.test('aabcd')) var reg = /^abc/ console.log(rg.test('abc')) // true console.log(rg.test('abcd')) // true console.log(rg.test('aabcd')) // false var reg = /^abc$/ // 精确匹配,要求必须是 abc 字符串才符合规范。 console.log(rg.test('abc')) // true console.log(rg.test('abcd')) // false console.log(rg.test('aabcd')) // false
字符类
- []表示有一系列字符可供选择,只要匹配其中一个就可以了。
所有可供选择的字符都放在方括号内
。
var rg = /[abc]/ // 只要包含有 a 或者 b 或者包含有 c 都返回 true。 console.log('andy') // true console.log('body') // true console.log('color') // true console.log('red') // false var rg = /^[abc]$/ // 三选一,只有是 a 或者是 b 或者是 c 这三个字母才返回 true。 console.log('aa') // false console.log('a') // true console.log('b') // true console.log('c') // true console.log('abc') // false
[-] 方括号内部范围符-z
var reg = /^[a-z]$/ // 26个英文字母任何一个返回 true。其他的都是 false (包括大写字母) // - 表示的是 a-z 的范围。
3.字符组合
var reg = /^[a-zA-Z0-9_-]$/ // 26个英文字母(大写和小写都可以)任何一个返回 true。
正则表达式中的量词符
量词符用来设定某个模式出现的次数
。
量词 | 说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
多次出现
var reg = /^[a-zA-Z0-9_-]${6,16}/ // {6,16}之间不能有空格。 // 这个模式能出现6-16次。
用户名验证
- 功能需求:
- 如果用户名输入合法,则后面提示信息为:用户名合法,并且颜色为绿色。
- 如果用户名输入不合法,则后面提示信息为:用户名不符合规范,并且颜色为红色。
- 分析:
- 用户名只能为英文字母、数字、下划线或者短横线组成,并且用户名长度为6~16位。
- 首先准备好这种正则表达式模式:
/^[a-zA-Z0-9_-]{6,16}$/
- 当表单失去焦点时就开始验证。
- 如果符合正则规范,则让后面的 span 标签添加 right 类。
- 如果不符合正则规范,则让后面的 span 标签添加 wrong 类。
<style> span{ color: #aaa; font-size: 14px; } .right{ color: green; } .wrong{ color: red; } </style> <body> <input type="text" class="uname"><span>请输入用户名</span> <script> var uname = document.querySelector('.uname') var span = document.querySelector('span') var reg = /^[a-zA-Z0-9_-]{6,16}$/ uname.onblur = function(){ if(reg.test(this.value)){ span.className = 'right' span.innerHTML = '用户名格式输入正确' }else{ span.className = 'wrong' span.innerHTML = '用户名格式输入错误' } } </script> </body>
括号总结
- 大括号:量词符,里面表示重复次数。
- 小括号:表示优先级。
- 中括号:字符集合,匹配方括号中的任意字符。
正则表达式中的预定义类
预定义类指的是某些常见模式的简写方式
。
预定义类 | 说明 |
\d | 匹配0-9之间的任一数字,相当于[0-9] |
\D | 匹配所有0-9以外的字符,相当于[^0-9] |
\w | 匹配任意的字母、数字和下划线,相当于[a-zA-Z0-9_] |
\W | 除所有字母、数字和下划线以外的字符,相当于[^a-zA-Z0-9_] |
\s | 匹配空格(包括换行符、制表符、空格符等),相当于[\t\r\n\v\f] |
\S | 匹配所有非空格的字符,相当于[^\t\r\n\v\f] |
## 正则表达式中的替换 | |
### replace 替换 | |
replace() 方法可以实现替换字符串操作,用来替换的参数可以是一个字符串或是一个正则表达式。 | |
语法:stringObject.replace(regexp/substr,replacement) |
- 第一个参数:被替换的字符串或者正则表达式。
- 第二个参数:替换为的字符串。
- 返回值是一个替换完毕的新字符串。
- replace 只能替换第一个需要替换的值。
正则表达式参数
语法:/表达式/[switch]
- switch(也称为修饰符)按照什么样的模式来匹配,有三种值:
- g:全局匹配。
- i:忽略大小写。
- gi:全局匹配,忽略大小写。