正则表达式书写方式以及常用正则

作者: Darren 分类: 学习 发布时间: 2019-06-04 22:45

正则就是对字符串进行匹配,匹配后再进行查找、分割、替换.

​ 正则有三要素:​ 找什么、找多少个、在哪里找。

在javascript中正则创建一般分为两种,一种是用“//”,方式创建,另外一种用new RegExp(正则表达式);方式来创建。

一、找什么?

1.1、普通字符

​ 代表本身的含义

1.2、元字符

是被正则赋予特殊的含义,与原来的含义不相同。

1.3、数字

独立表示 1 2 3 4 5 6 7 8 9 0

范围 [2-6]

​ :key:注意此种表示方式,匹配的是1位,除区间外不需要分隔符

简化表示 \d

非数字 \D \[^3-6]

​ :key:在[]符号内部的^表示不匹配其后的内容,不匹配3-6

1.4、字母

独立表示 a b c …. z A B C …. Z

范围 [a-zA-Z] [a-f]

​ :key:注意此种表示方式,匹配的是1位,除区间外不需要分隔符

非字母 [^a-z] [^a-f]

1.5、单词字符

单词字符包含:数字、字母、下划线

范围表示 [0-9a-zA-Z_]

简化方式 \w

非单词字符 \W

1.6、匹配汉字

[\u4e00-\u9fa5]

%title插图%num

 

3.7、制表符

\t

注意:

​ 如果是测试使用sublime

3.8、空白符

空白符包含 空格 制表符 换行 回车 分页

​ \s 表示空白符

​ \S 非空白符

3.9、.

用于匹配除\n之外所有的字符。

特殊符号(元字符) 含义
\d 数字
\D 非数字
[] 表示范围或区间
[a-z][A-Z] 字母
\w 单词字符
\W 非单词字符
\t 制表符
\s 空白符
\S 非空白符
. 除\n之外所有的字符
[^] 取反

%title插图%num

🔑如果想匹配以上这些特殊字符原字符,需要转义

%title插图%num

 

二、找多少位?

数量词,主要用于限定它前面的东西重复多少次。

?  0次或1次

+   1次或多次

*   不限制(有没有都可以以,有多次也无所谓)

{n }    n是一个非负数,出现就填写几次

{n, }    至少n次

{n, m}    至少n次,至多m次

%title插图%num

三、正则三要素?

^ 用于匹配一个字符串的开始位置

$ 用于匹配一个字符串的结束位置

\b 用于匹配单词的边界

示例:^ $

%title插图%num

 

 

四、正则的子表达式

1.子表达式就是将括号里面的内容又单独找出来,或者又单独的进行匹配

只要在正则表达式进行了分组设置,那么正则会使用每一个子表达式去匹配内容,将匹配的内容再单独保存到内存的一个缓存区,每个缓存区有一个唯一的标号。通过这个标号就可以引用匹配到的内容。

%title插图%num

代码:1:

var str = 'abcdesfdjiw45423da';

var reg=/abc(desfdj(iw)454)23da/;

console.log(reg.exec(str));

代码2:

    var op = '125466464964898';
    var link = /125(4664)64964898/;
    console.log(link.exec(op));

 

%title插图%num

五、反向引用

用于对正则所生成的子表达式匹配到的内容引用,就是引用第一个已经找到的内容

 

%title插图%num

代码1:

   var str ='df7483yrsfdljow839r4484394914944';

    var reg =/(\d)\1/g;
    
   
    console.log(str.match(reg));

先找到第一个数字的,\1引用第一个找到的内容,然后进行全局查找,结果返回两个44,44的数组。

 

代码2:


    var str = 'dfaj11221122oei22112233asd33dg34a56werad';
    var reg = /((\d)\2(\d)\3)\1/;
    console.log(str.match(reg));
在(\d)前面加了括号,导致(\d)要变成2的引用,后面的d也是要改变3.,最后那个\1是引用(\d)\2(\d)\3)前面括号里面的内容
所以找到的内容为:前面(\d)\2找到了11 后面那个(\d)\3找到了22,然后后面那个\1又引用了前面的内容,所以导致找到了11221122。

%title插图%num

 

相关案例:

 

1.利用str.replace(search,replace) str字符串中将搜索到的search替换为replace。

 

    // 需求:将重复的数字替换为*
    var str ='dfaj11111111oei2222asd333333dgwerad';
    var reg = /(\d)\1+/g
        // 这个表达式的意思就是找到这个数字第一个,然后+的意思就是尽量多的匹配,后面加一个g就是全局匹配
    console.log(str.replace(reg,'$1*'));  //这个意思就是保留找到的第一位 也就是1,然后将后面的进行换成*号

%title插图%num

2.将手机号码的中间的替换成****号。

 

需求:只保留一个手机的前3,后3,中间用*****代替

    var str ='12345678901';

    var reg =/(1\d{2})\d{5}(\d{3})/;
        这个表达式意思就是:
        一般手机号码第一位肯定是1
        然后找到1后面数字两位,单独提取出来
        然后在找到后面的5位,这部分我不需要提取的
        最后找到最后面3位
    console.log(str.replace(reg,'$1******$2'));    // 找到以后将str中的字符串进行替换,按照reg表达式规则,其中$1就是第一个子表达式内容,$2是最后的子表达式内容,中间的5位替换成*****

%title插图%num

3.解决结巴程序:

案例1:


// 案例一:
    var str = 'jjjjttwwwwssscccjjj';
    var reg =/(\w)\1+/g;
        // 这个正则的表达式的意思就是找到(\w)第一个字母,然后\1就是引用第一个子表达式的内容,然后+意思就是尽量多的去查找这个内容,g意思就是进行全局查找
    console.log(str.replace(reg,'$1'));     //找到以后str利用replace替换成reg要求的内容,$1就是只保留第一个,其他都不要

案例2:

// 案例二:
    var str = '今今今天晚晚晚晚晚晚上吃吃吃吃吃吃鸡';
    var reg =/([\u4e00-\u9fa5])\1+/g;
        // 这个正则的表达式的意思就是找到[\u4e00-\u9fa5]第一个中文,然后\1就是引用第一个子表达式的内容,然后+意思就是尽量多的去查找这个内容,g意思就是进行全局查找
    console.log(str.replace(reg,'$1'));     //找到以后str利用replace替换成reg要求的内容,$1就是只保留第一个,其他都不要

 

%title插图%num

 

六、正向预查

正向预查:
1.就是先找(?=a)部分
2.在判断前面的内容是否满足也就是\d{4}
3.如果满足了只要\d{4}匹配的内容
举例:就是你女朋友迷路了,然后给你打电话,然后说他周围的有哪些场景以及标志性建筑,然后你通过这个标志性建筑找到了你的女朋友,最后你主要你的女朋友,不要标志性建筑。前提你要有女朋友

代码:

var str = '1233123126784a';

var reg =/\d{4}(?=a)/;

console.log(reg.exec(str));

 

%title插图%num

 

 

七、负向预查

以(?!a)为行为特征进行匹配还有\d{4},不管找没找到都不要这后面的。
举例:就是利用完了,就不要它了,我只要前面的内容
代码:
var str ='12336784a';

var reg =/\d{4}(?!a)/g;   //这个表达式意思是查找前面带四位

console.log(reg.exec(str));

 

%title插图%num

 

 

预查案例:

var str='hello,when i am working,do not coming';
//需求:字符串里面的ing结尾的词根部分找出
//预查
//正向预查,正预测,前瞻,先行断言
//var reg=/\b\w+(?=ing\b)/g;
//varz=str.match(reg);
//需求:把不是ing结尾的单词找出来
//负向预查,负预测,前瞻,先行否定
var reg=/\b\w+(?!ing)\w{3}\b/g;  这个表达式意思就是查找\b代表单词间隔,查找单词,然后不要带ing的,并且大于三位长度的单词,进行全部查找
console.log(z);

八、js中正则对象

正则对象两种定义方式:js中正则表达式两边不用加引号

var pattern = /[a-z]/;//将正则表达式直接当做对象使用。
	var pattern = new RegExp(/[a-z]/);//实例化RegExp对象

1、test方法

test方法检测目标字符串和正则表达式是否匹配,如果匹配返回true,不匹配返回false。

正则表达式中,一般不需要加全局修饰符g。

var str = 'php1js22';
	var pattern = /^[a-z]/;//以小写字母开头
	var res = pattern.test(str);//匹配字符串是否以小写字母开头
	console.log(res);//true

2、exec方法

exec方法执行一个正则匹配,只匹配一次,匹配到结果就返回一个数组类型的结果,匹配不到就返回null。

正则表达式中,一般不需要加全局修饰符g。

即使正则表达式中,使用了全局匹配修饰符g,也只匹配一次。

var str = 'php1js22';
	var pattern = /[a-z]/;//匹配小写字母字符串
	//var pattern = /[a-z]/g;//全局匹配小写字母字符串
	var res1 = pattern.exec(str);
	console.log(res1);//["p"] 只匹配一次,返回数组

3、lastIndex属性

表示正则表达式,上一次匹配结束后的位置(目标字符串中的索引),即下一次匹配开始的位置。

lastIndex是一个整数,。没有更多匹配重置lastIndex为0.

test 方法和exec方法默认都只匹配一次。匹配后lastIndex 被自动重置为0.

特殊情况:如果正则表达式使用了全局匹配修饰符g,则lastIndex不会被重置为0.

var str = 'php1js22';
	//var pattern = /[a-z]/;//匹配小写字母字符串
	var pattern = /[a-z]/g;//全局匹配小写字母字符串
	var res1 = pattern.exec(str);
	console.log(res1);//["p"] 只匹配一次,返回数组
	console.log(pattern.lastIndex);//1  下一次匹配开始的位置
	var res2 = pattern.exec(str);
	console.log(res2);//["h"] //从位置1开始匹配

九、 String 对象的正则方法

str.match(reg) 用于在字符串str中查找满足正则规则的字符串,返回数组

str.search(reg) 用于查找正则匹配到的字符串的位置

str.split() 用于使用正则来分割字符串

str.replace(reg,rep) 在str字符串中将reg正则匹配到内容替换为rep指定的字符串。

常用正则表达式:

  • Email地址:^\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})+/.?
  • InternetURL:[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}$
  • 电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  • 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
  • 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
  • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
  • 帐号是否合法(字母开头,允许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])[a-zA-Z0-9]{8,10}$
  • 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在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)$
  • 钱的输入格式:
    1. 有四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:^[1-9][0-9]*$
    2. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0″不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
    3. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
    4. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
    5. 必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10” 和 “10.2” 是通过的:^[0-9]+(.[0-9]{2})?$
    6. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
    7. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
    8. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
    9. 备注:这就是最终结果了,别忘了”+”可以用”*”替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
  • 中文字符的正则表达式:[\u4e00-\u9fa5]
  • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
  • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
  • HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
  • 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
  • IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

 

索引:javascript\day07\20190604与javascript\day08\20190606

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注