常用的正则表达式

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 对象的方法:

方法描述FFIE
compile编译正则表达式。14
exec检索字符串中指定的值。返回找到的值,并确定其位置。14
test检索字符串中指定的值。返回 true 或 false。14

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 对象属性:

属性描述FFIE
globalRegExp 对象是否具有标志 g。14
ignoreCaseRegExp 对象是否具有标志 i。14
lastIndex一个整数,标示开始下一次匹配的字符位置。14
multilineRegExp 对象是否具有标志 m。14
source正则表达式的源文本。14

3.支持正则的String

支持正则表达式的 String 对象的方法

方法描述FFIE
search检索与正则表达式相匹配的值。14
match找到一个或多个正则表达式的匹配。14
replace替换与正则表达式匹配的子串。14
split把字符串分割为字符串数组。14
// 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

一、校验数字的表达式

  1. 至少n位的数字:^d{n,}$
  2. 零和非零开头的数字:^(0|[1-9][0-9]*)$
  3. 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
  4. 带1-2位小数的正数或负数:^(-)?d+(.d{1,2})?$
  5. 正数、负数、和小数:^(-|+)?d+(.d+)?$
  6. 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
  7. 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
  8. 非零的正整数:^[1-9]d*$ 或 ^([1-9][0-9]*){1,3}$^+?[1-9][0-9]*$
  9. 非零的负整数:^-[1-9][]0-9"*$^-[1-9]d*$
  10. 非负整数:^d+$^[1-9]d*|0$
  11. 非正整数:^-[1-9]d*|0$^((-d+)|(0+))$

二、校验字符的表达式

  1. 汉字:^[一-龥]{0,}$
  2. 英文和数字:^[A-Za-z0-9]+$^[A-Za-z0-9]{4,40}$
  3. 长度为3-20的所有字符:^.{3,20}$
  4. 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
  5. 由数字、26个英文字母或者下划线组成的字符串:^w+$ 或 ^w{3,20}$
  6. 中文、英文、数字包括下划线:^[一-龥A-Za-z0-9_]+$
  7. 中文、英文、数字但不包括下划线等符号:^[一-龥A-Za-z0-9]+$^[一-龥A-Za-z0-9]{2,20}$
  8. 可以输入含有^%&',;=?$"等字符:[^%&',;=?$"]+ 12 禁止输入含有~的字符:[^~"]+

三、特殊需求表达式

  1. Email地址:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$
  2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  3. InternetURL:[a-zA-z]+://[^s]* 或 ^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$
  4. 电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):^((d{3,4}-)|d{3.4}-)?d{7,8}$
  5. 国内电话号码(0511-4405222、021-87888822):d{3}-d{8}|d{4}-d{7}
  6. 身份证号(15位、18位数字):^d{15}|d{18}$
  7. 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$^d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
  8. 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  9. 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]w{5,17}$
  10. 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  11. 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
  12. 中国邮政编码:[1-9]d{5}(?!d) (中国邮政编码为6位数字)
  13. IP地址:d+.d+.d+.d+ (提取IP地址时有用)`
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值