1.正则表达式
正则表达式,又称规则表达式**。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换、验证表单、提取**那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。
正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
下面将介绍在 JavaScript 中如何使用正则表达式进行字符串操作。
2.基本使用
JavaScript有两种方式创建一个正则表达式:
1.第一种
语法: /正则表达式/
**正则表达式:**其实就是在执行搜索时的格式, 它由一些字母和数字组合而成.。
例如: 下面检索 str
字符串中是否存在 at
字符串
var str = 'A regular expression is a pattern that is matched against a subject string from left to right.'
console.log(/at/.test(str)) // 返回: true
console.log(/at/.exec(str)) // 返回一个数组: [ 'at',index: 27, ... ]
/at/
这个是正则的语法,底层会自动创建 RegExp对象( 其中 at
是正则表达式 ),test 和 exec 函数是RegExp对象的方法。
注意: /at/ 默认是区分大小写
RegExp 对象的方法:
方法 | 描述 | FF | IE |
---|---|---|---|
compile | 编译正则表达式。 | 1 | 4 |
exec | 检索字符串中指定的值。返回找到的值,并确定其位置。 | 1 | 4 |
test | 检索字符串中指定的值。返回 true 或 false。 | 1 | 4 |
2.第二种
语法:new RegExp('正则表达式:是一个字符串', '修饰符可选参数的字符串:g | i | m')
创建一个RegExp对象
例如: 下面检索 str
字符串中是否存在 at
字符串
var str = 'A regular expression is a pattern that is matched against a subject string from left to right.'
console.log(new RegExp('at').test(str)) // 返回: true
// console.log(new RegExp(/at/).test(str)) // 返回: true
console.log(new RegExp('at').exec(str)) // 返回一个数组: [ 'at',index: 27, ... ]
例如:检索 str
字符串中出现 at
字符串的次数。( pattern that is matched 中有3个 at 字符串)
var str = 'A regular expression is a pattern that is matched against a subject string from left to right.'
var reg = new RegExp('at','g') // g代表时全局索引,即搜索多次
while(reg.exec(str)){ // 如果存在着返回数组,否则返回null
console.log(reg.lastIndex) // 如果存在返回下一次匹配的字符位置,否则返回 0
}
其中 lastIndex 是 RegExp 对象的属性
RegExp 对象属性:
属性 | 描述 | FF | IE |
---|---|---|---|
global | RegExp 对象是否具有标志 g。 | 1 | 4 |
ignoreCase | RegExp 对象是否具有标志 i。 | 1 | 4 |
lastIndex | 一个整数,标示开始下一次匹配的字符位置。 | 1 | 4 |
multiline | RegExp 对象是否具有标志 m。 | 1 | 4 |
source | 正则表达式的源文本。 | 1 | 4 |
3.支持正则的String
支持正则表达式的 String 对象的方法
方法 | 描述 | FF | IE |
---|---|---|---|
search | 检索与正则表达式相匹配的值。 | 1 | 4 |
match | 找到一个或多个正则表达式的匹配。 | 1 | 4 |
replace | 替换与正则表达式匹配的子串。 | 1 | 4 |
split | 把字符串分割为字符串数组。 | 1 | 4 |
// 3.支持正则String
var str = 'A regular expression is a pattern that is matched against a subject string from left to right.'
console.log(str.search(/at/)) // 返回索引 27
console.log(str.match(/at/)) // 类似 exec 函数,返回 [ 'at',index: 27, ... ]
console.log(str.replace(/regular/, 'Regular')) // 返回一个新的字符串:A Regular expression....
console.log(str.split(' ')) // 按空格分割字符串,返回一个数组['A', 'regular', .... ]
3.正则语法
1.元字符
正则表达式主要依赖于元字符. 元字符不代表他们本身的字面意思, 他们都有特殊的含义. 一些元字符写在方括号中的时候有一些特殊的意思. 以下是一些元字符的介绍:
元字符 | 描述 |
---|---|
. | 句号匹配任意单个字符除了换行符. |
[ ] | 字符种类. 匹配方括号内的任意字符. |
[^ ] | 否定的字符种类. 匹配除了方括号里的任意字符 |
* | 匹配>=0个重复的在*号之前的字符. |
+ | 匹配>=1个重复的+号前的字符. |
? | 标记?之前的字符为可选. |
{n,m} | 匹配num个大括号之前的字符 (n <= num <= m)。例如:a{2} a{ 2 , } a{ 1,4 } a{ , 4 } |
(xyz) | 字符集, 匹配与 xyz 完全相等的字符串. |
| | 或运算符,匹配符号前或后的字符. |
\ | 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ | |
^ | 从开始行开始匹配. |
$ | 从末端开始匹配. |
1.^
号
^
用来检查匹配的字符串是否在所匹配字符串的开头.
// 5.检察某个字符串的开头
var str1 = 'A regular expression is a pattern'
var str2 = 'The regular expression is a pattern'
console.log(/^A.*/.exec(str1)) // 匹配字符串的开头是不是A, 返回匹配到的数组
console.log(/^A.*/.exec(str2)) // 匹配字符串的开头是不是A, 返回null
2.$
号
同理于 ^
号, $
号用来匹配字符是否是最后一个.
// 6.检察某个字符串的结尾
var str1 = 'A regular expression is a pattern'
var str2 = 'The regular expression is a pattern'
console.log(/.*ern$/.exec(str1)) // 匹配字符串的结尾是不是ern, 返回 匹配到的数组
console.log(/.*arn$/.exec(str2)) // 匹配字符串的开头是不是ern, 返回 null
console.log(/^The.*ern$/.exec(str2)) // 匹配字符串的开头是The,结尾是ern, 返回 匹配到的数组
3.修饰符
修正符它可以用来修改表达式的搜索结果. 这些修正符可以任意的组合使用, 它也是整个正则表达式的一部分.
标志 | 描述 |
---|---|
i | 忽略大小写. |
g | 全局搜索. |
m | 多行的: 锚点元字符 ^ $ 工作范围在每行的起始. |
// 7.检察某个字符串区分大小写
var str = 'A regular expression is a pattern'
console.log(/Regular/.test(str)) // 返回 false, 默认不区分大小写
console.log(/Regular/i.test(str)) // 返回 true, 区分大小写
// 8.全局检察某个字符串
var str = 'A regular expression is a pattern'
var reg1 = new RegExp('re') // 1.搜索一次
do{
console.log(reg1.exec(str))
}while(reg1.lastIndex>0)
var reg2 = new RegExp('re','g') // 2.全局搜索(搜索多次),默认区分大小写
do{
// console.log(reg2.exec(str))
}while(reg2.lastIndex>0)
var reg3 = new RegExp('Re','gi') // 3.全局搜索(搜索多次),并且不区分大小写
do{
// console.log(reg3.exec(str))
}while(reg3.lastIndex>0)
4.()分组
分组符号将( 表达式 )
之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用RegExp. $1 到 RegExp.$9 的符号来引用匹配到的值。
// 9.分组功能
var reg = /I love (js|java|ios)/;
console.log(reg.test('I love js')) // true
console.log(RegExp.$1) // js
console.log(reg.test('I love jack')) //false
// 9.1 匹配字符串是否是合法的日期格式
var str = '2019-09-26'
var reg1 = /\d{4}-\d{2}-\d{2}/
console.log(reg1.test(str)) // true
console.log(RegExp.$1) // 获取第1个括号的内容 为空
console.log(RegExp.$2) // 获取第2个括号的内容 为空
console.log(RegExp.$3) // 获取第3个括号的内容 为空
// 9.2 匹配字符串是否是合法的日期格式,并且提取对应的年,月,日
var reg2 = /(\d{4})-(\d{2})-(\d{2})/
console.log(reg2.test(str)) // true
console.log(RegExp.$1) // 获取第1个括号的内容 2019
console.log(RegExp.$2) // 获取第2个括号的内容 09
console.log(RegExp.$3) // 获取第3个括号的内容 26
// 9.3 匹配字符串是否是合法的手机,并且隐藏中间4个号码
var str = '18312016879'
var reg = /(1[3|4|5|6|7|8|]{2})\d{4}(\d{4})/
var newStr = str.replace(reg,'$1****$2') // $1代表时第一个()匹配到的结果:RegExp.$1
console.log(newStr) // 183****6879
5. 简写字符集
正则表达式提供一些常用的字符集简写. 如下:
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
\w | 匹配所有字母数字, 等同于 [a-zA-Z0-9_] |
\W | 匹配所有非字母数字, 即符号, 等同于: [^\w] |
\d | 匹配数字: [0-9] |
\D | 匹配非数字: [^\d] |
\s | 匹配所有空格字符, 等同于: [\t\n\f\r\p{Z}] |
\S | 匹配所有非空格字符: [^\s] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\p | 匹配 CR/LF (等同于 \r\n ),用来匹配 DOS 行终止符 |
4.常用正则
1.只能输入非负数字
// 1.只能输入非负数字
var reg = /^\d*$/
console.log(reg.test('-222')) // false
console.log(reg.test('2222')) // true
console.log(reg.test(' 2222')) // false
console.log(reg.test('文字')) // false
2.只能输入非负数字,最大5位
// 2.只能输入非负数字,最大5位
var reg = /^\d{1,5}$/
console.log(reg.test('22222')) // true
console.log(reg.test('222')) // true
console.log(reg.test('2222222')) // false
3.前后不能输入空格
// 3.前后不能输入空格
var reg =/(^\s+)|(\s+$)/
console.log(reg.test(' 111 ')) // true
console.log(reg.test('111 ')) // true
console.log(reg.test('111')) // false
console.log(reg.test('文字')) // false
4.不能输入函有中文
// 4.不能输入中文
var reg =/[\u4E00-\u9FA5]/
console.log(reg.test('223443')) // false
console.log(reg.test('adfasfd')) // false
console.log(reg.test('4545sdfsdf')) // false
console.log(reg.test('adfa文字sfd')) // true
console.log(reg.test('文字')) // true
5.手机号码
var reg =/^1[3|4|5|6|7|8][0-9]{9}$/
console.log(reg.test('11111'))// false
console.log(reg.test('18312016879')) // true
console.log(reg.test('183120168791'))// false
6.输入纯中文
var reg = /^[一-龥]{0,}$/
console.log(reg.test('文字')) // true
console.log(reg.test('sdfs文字')) // false
console.log(reg.test('sdfs')) // false
console.log(reg.test('1111')) // false
一、校验数字的表达式
- 至少n位的数字:
^d{n,}$
- 零和非零开头的数字:
^(0|[1-9][0-9]*)$
- 非零开头的最多带两位小数的数字:
^([1-9][0-9]*)+(.[0-9]{1,2})?$
- 带1-2位小数的正数或负数:
^(-)?d+(.d{1,2})?$
- 正数、负数、和小数:
^(-|+)?d+(.d+)?$
- 有两位小数的正实数:
^[0-9]+(.[0-9]{2})?$
- 有1~3位小数的正实数:
^[0-9]+(.[0-9]{1,3})?$
- 非零的正整数:
^[1-9]d*$ 或 ^([1-9][0-9]*){1,3}$
或^+?[1-9][0-9]*$
- 非零的负整数:
^-[1-9][]0-9"*$
或^-[1-9]d*$
- 非负整数:
^d+$
或^[1-9]d*|0$
- 非正整数:
^-[1-9]d*|0$
或^((-d+)|(0+))$
二、校验字符的表达式
- 汉字:
^[一-龥]{0,}$
- 英文和数字:
^[A-Za-z0-9]+$
或^[A-Za-z0-9]{4,40}$
- 长度为3-20的所有字符:
^.{3,20}$
- 由数字和26个英文字母组成的字符串:
^[A-Za-z0-9]+$
- 由数字、26个英文字母或者下划线组成的字符串:
^w+$ 或 ^w{3,20}$
- 中文、英文、数字包括下划线:
^[一-龥A-Za-z0-9_]+$
- 中文、英文、数字但不包括下划线等符号:
^[一-龥A-Za-z0-9]+$
或^[一-龥A-Za-z0-9]{2,20}$
- 可以输入含有
^%&',;=?$"
等字符:[^%&',;=?$"]+ 12
禁止输入含有~的字符:[^~"]+
三、特殊需求表达式
- Email地址:
^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$
- 域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
- InternetURL:
[a-zA-z]+://[^s]* 或 ^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$
- 电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):
^((d{3,4}-)|d{3.4}-)?d{7,8}$
- 国内电话号码(0511-4405222、021-87888822):
d{3}-d{8}|d{4}-d{7}
- 身份证号(15位、18位数字):
^d{15}|d{18}$
- 短身份证号码(数字、字母x结尾):
^([0-9]){7,18}(x|X)?$
或^d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
- 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):
^[a-zA-Z]w{5,17}$
- 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):
^(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
- 腾讯QQ号:
[1-9][0-9]{4,}
(腾讯QQ号从10000开始) - 中国邮政编码:
[1-9]d{5}(?!d)
(中国邮政编码为6位数字) - IP地址:
d+.d+.d+.d+
(提取IP地址时有用)`