JS:正则表达式

String

String.match(RegExp)

使用一个字符串调用(其原型对象中的)match方法,传入一个正则表达式对象作为参数,返回一个数组。

如果正则表达式对象具有g标识符,则返回数组中包含全部匹配结果,否则返回第一次匹配的结果。

var str="1 plus 2 equal 3"
var res = str.match(/\d/g)
console.log(res)//[1,2,3]

res = str.match(/\d/)
console.log(res)//[1, index: 0, input: 原字符串str, groups: undefined]

String.replace(RegExp,替换参数)

使用一个字符串调用(其原型中的)replace方法,传入一个正则表达式对象和一个替换参数作为参数,返回一个替换后的新字符串。如果正则表达式对象具有g标识符,则返回数组中包含全部匹配结果,否则返回第一次匹配的结果。

当替换参数是一个字符串时:

var str = '1 plus 2 equal 3'
var newStr = str.replace(/\d/,'壹')//正则表达式没有g标识符,只替换第一个匹配结果
console.log(newStr)//壹 plus 2 equal 3
var str = '1 plus 2 equal 3'
var newStr = str.replace(/(\d)[a-z ]*(\d)[a-z ]*(\d)/,'$1 + $2 = $3')//替换参数字符串中$n表示第n个匹配子串
console.log(newStr)//1 + 2 = 3

替换参数是一个函数时:

str = '1 plus 2 equal 3'
var newStr = str.replace(/\d/g,function(res,ind,str){
    switch (res){
        case '1':
            return '壹'
            break
    	case '2':
            return '贰'
            break
        case '3':
            return '叁'
            break
        default:
            return ''
    }
})
console.log(newStr) // 壹 plus 贰 equal 叁

替换函数的第一个参数是匹配结果,第二个参数是匹配结果的下标,第三个参数是原字符串,返回值作为replace要替换的值返回到新字符串。

String.search(RegExp)

类似indexOf,可以当indexOf的正则版使用,但是只接受一个参数,只返回第一次匹配到的结果的起始下标。

var str = 'abcdefg hijklmn opq rst uvw xyz'
var res = str.search(/\d/)
console.log(res)//-1

res = str.search(/\w/g)//忽略g标识符,
console.log(res)//0

String.split(RegExp)

用法和参数为字符串时一样。

RegExp

RegExp.test(str)

一个正则表达式使用test方法验证一个字符串是否匹配,接受一个参数即要验证的字符串,返回true或false。

var tel = '18800001111'
var reg = /^1[35-8]\d{9}$/
var res = reg.test(tel)
console.log(res)//true

tel = '14400001111'
res = reg.test(tel)
console.log(res)//false

RegExp.exec(str)

一个正则表达式使用exec方法检索一个字符串中所有匹配的结果,接受一个参数即要验证的字符串,返回一个数组(或null)。

var tel = '18800001111,14400001111,13300001111,15500001111,17700001111,16600001111'
var reg = /1[35-8]\d{9}/g
var res = reg.exec(tel)
console.log(res)//["18800001111", index: 0, input: 原字符串tel, groups: undefined]

res = reg.exec(tel)
console.log(res)//["13300001111", index: 24, input: 原字符串tel, groups: undefined]

res = reg.exec(tel)
console.log(res)//["15500001111", index: 36, input: 原字符串tel, groups: undefined]

res = reg.exec(tel)
console.log(res)//["17700001111", index: 48, input: 原字符串tel, groups: undefined]

res = reg.exec(tel)
console.log(res)//["16600001111", index: 60, input: 原字符串tel, groups: undefined]

res = reg.exec(tel)
console.log(res)//null 此时lastIndex重置为0 下一次会再次重头开始匹配字符串

res = reg.exec(tel)
console.log(res)//["18800001111", index: 0, input: 原字符串tel, groups: undefined]

在局部使用时和String.match方法完全相同;在全局使用时,如果匹配到结果,返回的数组包含 [ 匹配结果 ,  index: 匹配结果起始下标 ,  input: 传入的原字符串 ,  groups: undefined ],每执行一次匹配正则表达式对象会自动记录lastIndex作为属性保存上一次执行的结束位置,下一次执行会直接匹配lastIndex之后的内容,在匹配完一个字符串之后(返回nunll)lastIndex会自动重置为0。

运算符

基本元字符

[] 定义一个字符集; - 定义字符集内区间 ;^ 表示字符集内取非。如:[^0-9] 相当于 \D ,[^a-zA-Z0-9_] 相当于 \W。

\  在非特殊字符之前表示该字符为一个特殊字符。常用特殊字符:\d 相当于[0-9] , \w 相当于[a-zA-Z0-9_] , \s 匹配所有空白符, \n 换行符 等。

. 匹配除换行符外所有字符,使用 \. 表示匹配英文句号。

| 逻辑或操作符。

数量元字符

{m,n} 表示前一个字符集为m到n次重复,{m}表示前一个字符集为m次重复,{m, }表示前一个字符集为m次以上重复。

+ 表示前一个字符集为1次以上重复,相当于 {1, } 。

*  相当于{0,},即任意次。

? 相当于{0,1}。如果在数量元字符后使用,则表示使用费贪婪模式(默认贪婪模式)。

位置元字符

^ 匹配表达式开始。

$ 匹配表达式结尾。

\b 匹配单词边界,\B 为非单词边界。

(?=p) 匹配p之前

(?!p) 匹配非p之前

标识符

g 全局搜索

i 忽略大小写

m 多行匹配

标识符用在表达式外部结尾,或单独定义正表达式对象属性,如 /\d/g 相当于 new RegExp('\d',g)。

优先级

正则表达式中同级从左到右计算,不同级从高到低计算,运算符优先级由高到低如下

\  转义

[] 、() 、(?=)  字符集 和 括号

* 、+ 、? 、{}  数量 

^ 、$ 、其他字符  位置和顺序 不包括(?=)

|  逻辑

分组和分支

正则表达式中通过 () 和 | 可以实现分组和分支的处理,如下:

var price = '¥6990000.00'
var reg = /^(¥|$)(\d+)\.(00)$/
var res = price.match(reg)
console.log(res);
// ["¥6990000.00", "¥", "6990000", "00", index: 0, input: "¥6990000.00", groups: undefined]

贪婪模式

正则表达式中字符序列默认使用贪婪模式匹配,除非使用?来限定。

var price = '¥699000000'
var reg = /¥\d+/
var res = price.match(reg)
console.log(res);// ["¥699000000", index: 0, input: 原字符串price, groups: undefined]

reg = /¥\d+?/
res = price.match(reg)
console.log(res);// ["¥6", index: 0, input: 原字符串price, groups: undefined]

正则表达式中分支默认不使用贪婪模式匹配。

var price = '¥6990000.00'
var reg = /¥(\d+|\d+\.00)/
var res = price.match(reg)
console.log(res); // ["¥6990000", "6990000", index: 0, input: "¥6990000.00", groups: undefined]

上面的代码中匹配到第一个分支的内容没有继续匹配,所以匹配结果不包含小数点及后面的内容。

位置和字符

正则表达式除了用来匹配字符,还可以匹配位置,如:

var price = '19.99'
var reg = /^/
price = price.replace(reg,'¥')
console.log(price)// ¥19.99

上面的代码使用正则表达式匹配了字符串的开头的位置而不是字符串,使用replace实现在开头添加指定字符。

var price = 69900000
var reg = /(?=(\d{3})+$)/g
price = price.toString().replace(reg,',')
console.log(price) //69,900,000

上面的代码中,使用(?= p )位置元字符来匹配 p 之前的位置,这里p为 \d{3}+$ ($ 和 {} 优先级高于 (?=) ,所以  \d{3}+$ 作为一个整体),表示从尾部起3个或3的倍数个数字,使用replace方法,实现在从尾部起每3个数字之前添加','。

但是这里有一个问题,如果字符串长度正好是3的整数倍,则会在字符串开头位置也添加逗号,优化后如下:

var price = 669900000
var reg = /(?!^)(?=(\d{3})+$)/g
price = price.toString().replace(reg,',')
console.log(price) //669,900,000

新增了不在开头之前的位置匹配。

常用正则表达式汇总

中文姓名:^[\u4e00-\u9fa5]{2,4}$

e-mail:^\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})+/.?

URL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}

短身份证号码(数字、字母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}$

日期格式:^\d{4}-\d{1,2}-\d{1,2}

一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$

一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)

首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)

中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用) 或 ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值