文章目录
- RegExp 对象
- 创建RegExp对象
- 正则表达式语法
- RegExp 对象方法
- 支持正则表达式的 String 对象的方法
- RegExp.prototype[@@search]()
- replace() 方法
- match()
- 常用正则表达式
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 对象的方法
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+$/;
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