帮你读懂正则表达式

简介: 什么是正则表达式?通过正则表达式创建2种方式、正则表达式的组成剖析、几个例子分析来帮你读懂常见正则表达式。

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

非 (数字、字母、下划线)任意一个字符

| 、
[xyz]

或: 举例: x|y、 x|y|z
[xyz] :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.  [ ]

  1. 中括号中出现的字符一般都代表本身的含义
  2. \d 在中括号中还是 0-9
  3. 中括号中不存在多位数
//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]   捕获结果是个数组





相关文章
|
6月前
|
Shell Linux
熟练使用正则表达式(1)
熟练使用正则表达式。
46 2
|
22天前
|
Python
Python编程中正则表达式的使用
【10月更文挑战第22天】正则表达式,一种强大的文本处理工具,在Python编程中有着广泛的应用。本文将介绍如何使用Python中的re库来使用正则表达式,包括如何创建、匹配、查找和替换字符串等。通过学习本文,你将能够掌握Python中正则表达式的基本使用方法。
|
3月前
|
大数据 程序员
为什么要学正则表达式 - 1
为什么要学正则表达式 - 1
18 1
|
3月前
为什么要学正则表达式 - 2
为什么要学正则表达式 - 2
17 1
|
3月前
|
Python
为什么要学正则表达式 - 5
为什么要学正则表达式 - 5
20 0
|
3月前
|
Python
为什么要学正则表达式 - 4
为什么要学正则表达式 - 4
18 0
|
5月前
|
程序员
程序员必知:常用正则表达式
程序员必知:常用正则表达式
26 0
|
6月前
|
Shell
熟练使用正则表达式(2)
熟练使用正则表达式。
35 2
 熟练使用正则表达式(2)
学习正则表达式
学习正则表达式
47 0