regular expression : RegExp
正则表达式用来处理字符串的规则
- 只能处理字符串;
- 它是一个规则:验证字符串是否符合某个规则(test);也可以把字符串中符合规则的内容捕获到(exec/match)
1、创建正则表达式的2种方式
1.1 创建正则表达式2种方式
- 字面量创建方式://。两个斜杠之间包起来的都是用来描述规则的元字符。
// \d 表示0-9的数字letreg1=/\d+/
- 构造函数创建方式:两个参数:元字符字符串, 修饰符字符串
letreg2=newRegExp("\\d+")
1.2 创建正则表达式2种方式的区别
- 构造函数中,因为传递的是字符串,\ 需要写两个才代表斜杠
letreg=/\d+/g; letreg1=newRegExp("\\d+","g");
- 正则表达式中部分内容是 变量存储的值--只能用构造函数的方式
两个斜杠中间包起来的都是元字符(如果正则中要包含某个变量的值,则不能使用字面量方式创建)
lettype="haojing"; letreg=/^@"+type+"$/; console.log(reg.test("@haojing@")); // falseconsole.log(reg.test('@"""typeeee"@')); // trueletreg1=newRegExp("^@"+type+"@$"); //字符串拼接的方式console.log(reg.test("@haojing@")); // true
2、正则表达式由2部分组成
- 元字符
- 修饰符
2.1 常用的元字符
- 常用的量词元字符:设置出现的次数
量词元字符 |
说明 |
* |
出现零到多次 |
+ |
出现一到多次 |
? |
出现零次或1次 |
{n} |
出现n次 |
{n, } |
出现n到多次 |
{n,m} |
出现n 到m 次, 包含n也包含m |
- 常用的特殊元字符:单个或者组合在一起代表特殊的含义
普通元字符: 代表本身含义 如:/haojing/ 匹配的就是"haojing"
特殊元字符 |
说明 |
特殊元字符 |
说明 |
\ |
转义字符(普通转特殊;特殊转普通) |
||
\n |
换行符 |
. |
除 \n (换行符)以外的任意字符 |
^ |
以哪个元字符作为开始 |
$ |
以哪个元字符作为结束 |
\d |
0~9之间的一个数字 |
\D |
Z非0-9之间的一个数字(大写和小写的意思是相反的) |
\w |
数字、字母、下划线任意一个字符 |
\W |
非 (数字、字母、下划线)任意一个字符 |
| 、 |
或: 举例: x|y、 x|y|z |
[^xy] |
除了x或者y以外的任意字符 |
[a-z] |
指定a-z范围中的任意字符 [0-9a-zA-Z_] ===\w |
[^a-z] |
非... 上一个取反; |
( ) |
正则中的分组 |
(?:) |
只匹配不不捕获 |
(?=) |
正向预查 |
(?!) |
负向预查 |
2.2 常用的修饰符:img
i |
ignoreCase 忽略单词大小写匹配 |
m |
multiline 可以进行多行匹配 |
g |
global 全局匹配 |
3、几个常用的元字符剖析
3.1. ^ 与 $
- ^ $ 两个都不加,字符串中包含符合规则的内容即可
- ^ $ 两个都加,字符串只能是和规则一致的内容
// ^ 以xx开头letreg=/^\d/; console.log(reg.test("haojing")); // falseconsole.log(reg.test("2022haojing")); // trueconsole.log(reg.test("haojing2022")); // false// $ 以xx结尾letreg1=/\d$/; console.log(reg1.test("haojing")); // falseconsole.log(reg1.test("2022haojing")); // falseconsole.log(reg1.test("haojing2022")); // true// ^ $ 两个都不加letreg2=/\d+/; console.log(reg2.test("2022haojing")); // true// ^ $ 两个都加letreg3=/^\d+$/; console.log(reg3.test("2022haojing")); // falseconsole.log(reg3.test("2022")); // true//举个例子:需求:验证手机号码(11位 ,第一个字母是1即可)letreg4=/^1\d{10}$/console.log(reg4.test("13078990288")); // true
3.2. \
- \ :转义字符(普通转特殊;特殊转普通)
// . 不是小数点,是除\n外的任意字符letreg1=/^2.3$/; console.log(reg1.test("2.3")); // trueconsole.log(reg1.test("2@3")); // trueconsole.log(reg1.test("23")); // false// . 基于转义字符,让其只能代表小数点letreg2=/^2\.3$/; console.log(reg2.test("2.3")); // trueconsole.log(reg2.test("2@3")); // falseconsole.log(reg2.test("23")); // falseletstr="\d"; letreg3=/^\d$/; // \d=>代表0-9的数字console.log(reg3.test(str)); // falseletreg=/^\\d$/// \ =>把特殊转义为普通console.log(reg.test("\d")); // falseconsole.log(reg.test("\\d")); // true
3.3. x|y
x|y 会存在很乱的优先级问题,
一般我们写的时候都伴随着小括号进行分组,因为小括号改变处理的优先级
letreg1=/^18|29$/; console.log(reg1.test("18")); // trueconsole.log(reg1.test("29")); // trueconsole.log(reg1.test("1829")); // trueconsole.log(reg1.test("182")); // trueconsole.log(reg1.test("189")); // trueconsole.log(reg1.test("829")); // trueconsole.log(reg1.test("129")); // trueletreg2=/^(18|29)$/; console.log(reg2.test("18")); // trueconsole.log(reg2.test("29")); // trueconsole.log(reg2.test("1829")); // trueconsole.log(reg2.test("182")); // falseconsole.log(reg2.test("189")); // falseconsole.log(reg2.test("829")); // falseconsole.log(reg2.test("129")); // false
3.4. [ ]
- 中括号中出现的字符一般都代表本身的含义
- \d 在中括号中还是 0-9
- 中括号中不存在多位数
//1、中括号中出现的字符一般都代表本身的含义letreg=/^[@+]+$/; console.log(reg.test("@@")); // trueconsole.log(reg.test("@+")); // trueletreg1=/^[@+]$/; console.log(reg1.test("@")); // trueconsole.log(reg1.test("+")); // trueconsole.log(reg1.test("@@")); // falseconsole.log(reg1.test("@+")); // false// 2、 \d在中括号中还是 0-9letreg2=/^[\d]$/; console.log(reg2.test("d")); // falseconsole.log(reg2.test("\\")); // falseconsole.log(reg2.test("9")); // true// 3、中括号中不存在多位数letreg3=/^[18]$/; console.log(reg3.test("1")); // trueconsole.log(reg3.test("8")); // trueconsole.log(reg3.test("18")); // falseletreg4=/^[10-29]$/; // 1或者0 - 2或者9console.log(reg4.test("1")); // trueconsole.log(reg4.test("9")); // trueconsole.log(reg4.test("0")); // trueconsole.log(reg4.test("2")); // trueconsole.log(reg4.test("10")); // falseletreg5=/^[(10-29)]$/; console.log(reg5.test("(")); // trueconsole.log(reg5.test("15")); // falseletreg6=/^[\(10-29\)]$/; console.log(reg5.test("(")); // trueconsole.log(reg5.test("15")); // false
4、常用的几个正则表达式分析
4.1. 验证是否为有效数字
/**规则分析*1、可能出现+ 、- 也可能不出现;[+-]?*2、一位 0-9都可以,多位首位不能是0;(\d|([1-9]\d+))*3、小数部分可能有,可能没有;一旦有后面必须有小数点+数字; (\.\d+)?*/letreg=/^[+-]?(\d|([1-9])\d+)(\.\d+)?$/
4.2. 验证是否为有效数字
/**规则分析*1、数字、字母、下划线*2、6-16位*/letval=""letreg=/\w{6,16}/letflag=reg.test(val)
4.3. 验证真实姓名
/**规则分析*1、汉字 /^[\u4E00-\u9FA5]$\*2、名字长度 2-10位*3、可能有译名 ·汉字 (·[\u4E00-\u9FA5]{2,10})? 可能最多出现2次 (·[\u4E00-\u9FA5]{2,10}){0,2}*/letreg=/^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10})?$/; letreg1=/^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10}){0,2}$/;
4.4. 验证邮箱
/**规则分析之一(@分割先后两部分) \w+((-\w+)|(\.\w+))**1、以数字、字母、下划线开头,1-多位; \w+*2、还可以是 -数字字母下划线或者 .数字字母下划线,整体0到多次;((-\w+)|(\.\w+))* :*=》邮箱名由数字、字母、下划线、-、. 几部分组成,但是 - .不能连续出现也不能作为开始*//**规则分析之二(@分割先后两部分) [A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+*1、@后面紧跟着 数字、字母(1-多位)*2、对@后面名字的补充:多域名 .com.cn 企业域名 zxt@zhufeng-peixun-office.com ;((\.|-)[A-Za-z0-9]+)**3、匹配最后的域名(.com/.cn/.org/.edu/.net...);.[A-Za-z0-9]+*/letreg=/^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; console.log(reg.test('lili303248725@163.com'))//true
4.5. 身份证号码
/**规则分析*1、一共18位*2、最后以外可能是X (代表10)省份证前6位:省市县 130435 中间8位:年月日最后四位:最后1位 X或者数字 倒数2位 偶数 女 奇数 男 其余两位 是经过算法算出来的*/letreg=/^/d{17}(/d|X)$/// 小括号作用第二个作用:分组捕获 不仅可以把大正则匹配的信息捕获到,还可以单独捕获到每个小分组的内容分 letreg1=/^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/; reg1.exec("130435198703241263") // ["130435198703241263", "130435", "1987", "03", "24", "6", "3", index: 0, input: "130435198703241263", groups: undefined] 捕获结果是个数组