RegExp 对象


RegExp 对象

  • ·RegExp·对象表示正则表达式,是由普通字符和特殊字符(也叫元字符或限定符)组成的文字模板
  • 用途:对字符串执行模式匹配

创建RegExp对象


构造函数

var 变量 = new RegExp("正则表达式","匹配模式");

字面量

var 变量 = /正则表达式/匹配模式;

使用·typeof·检查正则对象,会返回·object·

正则表达式语法


匹配模式

  • g:global 全局匹配
  • i :ignore case 忽略大小写匹配
  • m : multiple lines 多行匹配

基本元字符

  • . : 任何单个字符(除了换行和行结束符)
  • \ : 转义字符,表示后一个字符不能从字面上解释
  • | : 或
  • [] : 定义一个字符集合,匹配字符集合中的任意字符,/[abc]/- 等价于/a|b|c/
  • [^] : 对上面一个集合取非
  • - : 定义一个区间
表达式描述
[abc]查找方括号之间的任何字符。
[^abc]查找任何不在方括号之间的字符。
[0-9]查找任何从 0 至 9 的数字。
[a-z]查找任何从小写 a 到小写 z 的字符。
[A-Z]查找任何从大写 A 到大写 Z 的字符。
[A-z]查找任何从大写 A 到小写 z 的字符。
[adgk]查找给定集合内的任何字符。
[^adgk]查找给定集合外的任何字符。
(red|blue|green)查找任何指定的选项。

特殊元字符

元字符描述
.查找单个字符,除了换行和行结束符。
\w查找数字、字母及下划线。
\W查找非单词字符。
\d查找数字。
\D查找非数字字符。
\s查找空白字符。
\S查找非空白字符。
\b匹配单词边界。
\B匹配非单词边界。
\0查找 NULL 字符。
\n查找换行符。
\f查找换页符。
\r查找回车符。
\t查找制表符。
\v查找垂直制表符。
\xxx查找以八进制数 xxx 规定的字符。
\xdd查找以十六进制数 dd 规定的字符。
\uxxxx查找以十六进制数 xxxx 规定的 Unicode 字符。

量词和位置

表达式描述
[abc]查找方括号之间的任何字符。
[^abc]查找任何不在方括号之间的字符。
[0-9]查找任何从 0 至 9 的数字。
[a-z]查找任何从小写 a 到小写 z 的字符。
[A-Z]查找任何从大写 A 到大写 Z 的字符。
[A-z]查找任何从大写 A 到小写 z 的字符。
[adgk]查找给定集合内的任何字符。
[^adgk]查找给定集合外的任何字符。
(red|blue|green)查找任何指定的选项。

贪婪与懒惰(非贪婪)

正则表达式默认会匹配贪婪模式(尽可能多的匹配)。
在这里插入图片描述

RegExp 对象方法


exec()

参数

str:要匹配正则表达式的字符串。

返回值

  • 匹配成功,返回一个数组(包含额外的属性index和input),并更新正则表达式对象的lastIndex属性。
  • 匹配失败,返回null,并把lastIndex重置为0。
RegExpObject.exec(string);
var s = '_x_x';
var r = /_(x)/;

r.exec(s) // ["_x", "x"]

const reg = RegExp('foo*', 'g')
const str = 'table footable, foosball'
let arr

while (((arr = reg.exec(str)) !== null)) {
    console.log(`Found ${arr[0]}. Next starts at ${reg.lastIndex}.`)
}

//Found foo. Next starts at 9.
// Found foo. Next starts at 19.

RegExp.prototype.test()

  • 正则实例对象的test方法返回一个布尔值,表示当前模式是
  • 否能匹配参数字符串。
var r = /x/g;
var s = '_x_x';

r.lastIndex // 0
r.test(s) // true

r.lastIndex // 2
r.test(s) // true

r.lastIndex // 4
r.test(s) // false

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


检索与正则表达式相匹配的值的位置:str.search(/keyword/)
Tips:匹配成功返回匹配对象的位置,否则返回-1,不支持全局匹配

将匹配的对象以数组的形式返回:str.match(/RegExp/gi)
Tips:默认匹配到一个即停,设置gi则表示全局且忽略大小写形式的匹配

将字符串分割为字符串数组:str.split(/RegExp/gi)
Tips:此处匹配规则不附加g亦会全局匹配

替换与正则表达式匹配的子串:str.replace(/RegExp/gi, newStr)

RegExp.prototype@@search

如果正则表达式带有g修饰符,则每一次test方法都从上一次结束的位置开始向后匹配。

搜索第一个符合条件的字符串 search()

search()【只会查找第一个】——搜索字符串中是否含有指定内容。如果搜索到指定内容,则会返回第一次出现的索引;否则返回-1。

var x = 'hello world!'
// 可以search 字符串
console.log(x.search('hello'));   // 0  返回起始位置
// 也可以search  RegExp 对象
console.log(x.search(/hello/));   // 0  返回起始位置
console.log(x.search(/world/));   // 6

replace() 方法

  • replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
    语法
str.replace(regexp/substr,replacement)
  • 返回值:一个新的字符串
  • 设置全局标志 g,替换所有匹配子串。否则,只替换第一个匹配子串。
  • replacement 中的 $ 字符具有特定的含义。
let str1 = '2020/5/20'
console.log(str1.replace(/\//g,"-"));  //得到 2020-5-20
   
var str2 = "Today is fine day,today is fine day !!!"
console.log(str2.replace("today","tomorrow"));  //只能替换第一个today
console.log(str2.replace(/today/gi,"tomorrow")); //这里用到了正则,且为“全局匹配”模式,才能替换所有的today

过滤HTML标签

str.replace(/<.*?>/g, "") 

去除空格

str = str.replace(/^\s*/, ""); //去除开头的空格
 
str = str.replace(/\s*$/, ""); //去除结尾的空格

match()

找到一个或多个正则表达式的匹配。

str.match(regexp);
  • 返回值:存放匹配结果的数组。
  • 找到一个还是多个取决于全局标志g。
  • 返回指定的值,而不是字符串位置。

示例代码如下:

var str = "Hello World!";
var reg = /[a-g]/g;

document.write(reg.exec(str) + "<br>"); // 输出:e
document.write(reg.test(str) + "<br>"); // 输出:true
document.write(reg.toString() + "<br>"); // 输出:/[a-g]/g
document.write(str.search(reg) + "<br>"); // 输出:1
document.write(str.match(reg) + "<br>"); // 输出:e,d
document.write(str.matchAll(reg) + "<br>"); // 输出:[object RegExp String Iterator]
document.write(str.replace(reg, "+") + "<br>"); // 输出:H+llo Worl+!
document.write(str.split(reg) + "<br>"); // 输出:H,llo Worl,!

常用正则表达式


用户名

//用户名正则,4到16位(字母,数字,下划线,减号)
var uPattern = /^[a-zA-Z0-9_-]{4,16}$/;

非零数字(只能输入数字,但值不能为0,可以是00,01等)

/^([0]{2}|0[1-9]|[1-9])\d*$/

验证保留两位小数的正整数或0

/^([1-9]\d*|0)(\.\d{1,2})?$/

验证手机号码,如13908653654

手机号码 /^1[3456789]\d{9}$/
/^(1[3|5|7|8][0-9]{9})$/


function checkPhone(){ 
    var phone = document.getElementById('phone').value;
    if(!(/^1[3456789]\d{9}$/.test(phone))){ 
        alert("手机号码有误,请重填");  
        return false; 
    } 
}

url

var urlP= /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;

身份证

// 身份证正则表达式(15位)
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
// 身份证正则表达式(18位)
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
身份证正则合并:(^\d{15}$)|(^\d{17}([0-9]|X)$)

身份证

// 身份证正则表达式(15位)
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
// 身份证正则表达式(18位)
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
身份证正则合并:(^\d{15}$)|(^\d{17}([0-9]|X)$)

密码强度

//密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;

整数

//正整数正则
var posPattern = /^\d+$/;
//负整数正则
var negPattern = /^-\d+$/;
//整数正则
var intPattern = /^-?\d+$/;

email

var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;

中文

var cnPattern = /[\u4E00-\u9FA5]/;

车牌号

var cPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;

微信号

//微信号正则,6至20位,以字母开头,字母,数字,减号,下划线
var wxPattern = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/;

日期

// 2020-01-20
var dP1 = /^\d{4}(\-)\d{1,2}\1\d{1,2}$/;

十六进制颜色

var cPattern = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;

原文链接:https://juejin.cn/post/6844903816781889543

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值