正则表达式

1.什么是正则表达式

正则:是规定一个字符串中字符出现的规律的表达式

2.什么时候使用呢?

只要使用一个种规则,模糊匹配关键词时候使用

3.怎么用正则呢?

<1.最简单的正则就是直接写关键词原文

<2、字符集:规定字符串中某一位字符,备选字符列表 只有一个字符,但是有多重选择字符

语法:[备选字符列表]

每个字符集只能匹配一位字符,且每个字符其中至少匹配一次

例如:[微wv][信x]  匹配到的内容: 微信 wx vx 微x v信 w信

如果备选字符列表是连续的,可用-省略中间字符

例如:
一位数字:[0123456789] ==>[0-9]

一位小写字母:[a-z]

一位大写字母:[A-Z]

一位字母:[a-zA-Z]

一位汉字:[u4e00-u9fa5]

特殊:除了xx以外[^xx]^必须写在正则的开头

4.预定义字符集:意思是对常用字符集的简写

w   一位字母数字或_ [0-9a-zA-Z_]

   

d  一位数字   [0-9]  digital(数位)

s  一位空字符  一切看不见的字符:空格,Tab ,回车..

 

.   一位任意字符

5.一个预定义字符集仅匹配一位字符,仅用于规定字符的内容

量词:专门规定一位字符集出现次数的规则,量词都是用于一个字符集只有默认修辞相邻的前一个字符集,量词需要用在字符后面

<1、有明确数量的边界

字符集{min,max} 规定字符集出现最少min次,最多max次

字符集{min,} 最少出现min次

字符集{n} 必须出现n次

<2、没有明确数量的边界 

字符集? 可有可无,最多出现一次

字符集* 可有可无,多了不限

字符集+ {1,} 至少出现一个,多了不限

仅修辞相邻的前一个字符集

选择和分组

分组:将多个字符集组成一组 可以让一个量词修饰多个字符集

ex: (字符集){  }

选择:"或" 匹配任意一个规则即可

ex: 规则1|规则2 (微|w(ei)?)(信|x(in)?)

<3.匹配指定位置的字符

字符串的开头 ^ ex: ^s+ 开头的空字符

字符串结尾 $ ex: s+$ 结尾的空字符

单词边界  ex:  no 

匹配no这个单词,但是前和后可以用标点或者空格和其他字符隔开

<4.手机号

(+86|0086)? +86或0086

s* 空字符,可有可无,多了不限制

1

[3457869] 3,4,5,6,7,8,9中挑一个

d{9} 9位数字

(+86|0086)?s*1[3456789]d{9}        正则中间不要加空格,容易被解析成规则 +前加上否则会被解析成量词

邮箱

数字/字母或_ 一次以上 w+

@

字母或数字 2位以上 [0-9a-zA-Z]{2,}

(. 和 (字母或数字) 2-3位) 1-2次

6.例句语法:

<1.var str = 'good good study,day day up';

           // 01234567890123456789012

var  i = str.indexOf('day',i+1);

 console .log(i);

//var i = str.indexOf("关键词",fromi);  从指定位置开始找下一个

<2.str = "no zuo no die no can no bibi ";

//循环变量

var i = -1;

//反复:通过改变i的值,查找str中包含弄关键词的位置

while((i = str.indexOf("no",i+1))!=-1){

console.log('在位置'+i+"发现敏感词");

}

//var i = str.lastIndexOf("关键词",fromi) 用法和indexOf相同,但是从后往前查找

console.log(str.lastIndexOf('no'));

// 问题:只能找一个关键词

// 解决:正则表达式

//2.判断字符串中是否包含了符合规范的敏感词

//var i = str.seach(/正则/)

//在str中查找一个符合正则表达式要求的关键词的位置

//返回值:找到的关键词的下标,如果找不到返回-1

//发送消息是,只要包括了'微信'就不让发送

7.查找匹配

1.验证:检查字符串是否完全符合正则表达式的要求!

 var bool = reg.test(待检测的字符串)

 输入六位数的密码 只要是验证,reg必须前加^后加$ 从头到尾的完整的匹配

 var reg = /^d{6}$/;

while(!reg.test(prompt('请输入密码:'))){

alert('密码格式不符!请输入六位数的密码!');

}

document.write('<h1>验证通过</h1>');

查找 关键词;第四种情况, 4.既找到所有关键词的内容也找到每个关键词的位置?

var arr = reg.exec(待检测的字符串)

返回值:本次找到的一个关键词及其位置

 arr[0]:关键词的内容

 如果正则中有分组

 arr[n]:自动保存第n个分组匹配的字内容

arr["index"]:当前关键词的位置 简写 arr.index

 如果 没找到,返回null

 每一次查找后,都将reg.lastIndex属性(下一次开始位置) 修改为位置index+关键词长度,相当于当前关键词继续向后找

8.正则创建

RegExp对象中封装了,正则表达式,并且提供使用正则的API查找和验证

利用正则查找关键词的四种情况 利用正则执行验证

var reg = /正则/ig; 正则是固定不变

1.创建固定不变的正则表达式 创建的是一个对象 直接量

var str = "no can n/o say , you can you up";

var reg = /n /o/g;      在双斜杠中写的是内容遵循的是正则的语法,因此想要使用/需要加上作为转义

9.正则的贪婪及懒惰

贪婪模式:正则表达式默认匹配最长的符合正则条件的子字符串

 .* .+

 ;懒惰模式:仅匹配最短的符合条件的子字符串

 贪婪改懒惰 2种方法

 1. .* .+ =====> .*? .+?

 2. [^xxx]*

例如:

var  html = '<link rel="stylesheet" href="RegExp.html"><body><ul><li><a class="active" href="http://www.bailiabn.com">百里半</a></li><li><a href="http://www.baidu.com" target="_blank">百度</a></li></ul></body>';

正则的分组是为精确的获取我想要匹配的内容

reg = /<as+[^>]*?href="([^"]*?)"/gi;

如果匹配出来的内容只关心字内容,不关心完整的内容

while(reg.exec(html) != null){

console.log(RegExp.$1);

RegExp.$n  可获取本次找到的第n个分组的子内容

}

原文地址:https://www.cnblogs.com/hyh888/p/11301405.html