正则基础知识

创建正则表达式

1.使用new来创建

 var exp = new RegExp('box' , 'gi' );

  

g	全局匹配
i	忽略大小写
m	多行匹配

  

2.使用字面量

var exp =/box/gi;

  

直接用2个 / ;

在俩个斜杠后加上模式修饰符;

俩种创建方式比较:

1.使用字面量方式创建用的更加广泛;

2.当要匹配的内容是变量时,只能使用new来创建.

正则表达式的测试

1.test( )

正则表达式对象.test(字符串)

参数:要匹配的字符串

返回值:匹配成功返回true,失败返回false

例1:
var exp = /Box/i;
var str = 'box' ;
alert(exp.test(str));
=>   true     忽略大小写 ;

  

例2:
var exp = /abc/g;
var str = 'abcab';
var res = exp.test(str);
console.log(res);
console.log(exp.test(str));
console.log(exp.test(str));
=>   true       //从第一个开始匹配,匹配到了abc 返回true;   
=>   false      //由于开启了全局匹配,所以从上次匹配之后的位置开始匹配(也就是从第二个a开始);   若没有g 则每次都会从头开始匹配
=>   true       //由于上次匹配是false并且已经将字符串str查找完了,所以又从头开始匹配

  

注:

​ 开启了全局匹配g后,正则表达式内部有一个lastIndex的属性,用以记录下次开始查找的下标,保证其每次从lastIndex的位置开始查找

例3:
var exp = /abc/g;                   //同一正则表达式匹配不同字符串
var str1 = 'abc';
var str2 = 'abcab';
console.log(exp.test(str1));
console.log(exp.test(str2));
=>   true;              //从str1的0位开始匹配,匹配到了abc,返回true,  此时lastIndex为3
=>   false;             //从str2中lastIndex的位置开始匹配,也就是从第二个a开始

  

例4:
var exp1 = /abc/g;                  //不同正则表达式匹配同一字符串
var exp2 = /abc/g;
var str = 'abc';
console.log(exp1.test(str));
console.log(exp2.test(str));
=>   true;              //从str1的0位开始匹配,匹配到了abc,返回true
=>   true;              //从str1的0位开始匹配,返回true

  

2.exec( )

exec(字符串):该方法为专门为捕获组而设计的

参数:要匹配的字符串

返回值:返回的是一个数组。如果不匹配则返回null

关于返回值数组的说明:

它确实是Array的实例。

但是这个数组有两个额外的属性:index和 input

index:表示匹配的字符串在源字符串中的索引

input:表示匹配的源字符串。

数组的第一项是与整个模式匹配的字符串,其他项是与模式中捕获组匹配的字符串

如果没有捕获组,则数组中只有第一项。关于捕获组的概念以后再说

例1:var exp = /abc/gi;var str = "aaabcccdabcAbcAdaBc";var strNew = "";while (strNew=exp.exec(str)){           //使用while循环,将所有匹配到字符串输出来console.log(strNew[0])              //由于返回的是一个带有很多属性的数组,所以我们只要数组中的字符串,也就是索引为0.}

  

正则表达式的规则

字符类:单个字母数字下划线
.                                   //匹配除换行符外的任意字符(当点放在[]中是,没有特殊意义)
var exp = /\d/g;                    // [0-9]
var exp = /\D/g;                    //[^0-9]
var exp = /\w/g;                    //[a-zA-Z0-9_];
var exp = /\W/g;                    //[^a-zA-Z0-9_];

  

字符类:空白字符
\0                             匹配null 字符
\b                             匹配退格字符
\n                             匹配换行符
\r                             匹配回车字符
\t                             匹配制表符
\s                             匹配空白字符、空格、制表符和换行符
\S                             匹配非空白字符

  

单词边界
\b
示例
/\bcat\b/  匹配到cat这个单词

  

/B 非单词边界

  

元字符/元符号                    匹配情况
^                             行首匹配
$                             行尾匹配

  

字符类:重复字符
元字符/元符号                                匹配情况
?  例如(x?)                            匹配0个或1 个x
*  例如(x*)                            匹配0个或任意多个x
+  例如(x+)                            匹配至少一个x
(xyz)+                                     匹配至少一个(xyz)
{m,n} 例如x{m,n}  n>=次数>=m            匹配最少m个、最多n个x
{n}                                        匹配前一项n次     
{n,}                                    匹配前一项n次,或者多次

  

1.[ ]

匹配[ ]内的任意一个字符

var exp = /[abc]/gi;                // []内代表匹配其中的一个字符: a 或 b 或 c
var exp = /[a-zA-Z0-9_$]/g;         //匹配26个大小写字母,0-9数字,下划线_  美元符$ 中的任意一个;
var exp = /[^a-zA-Z]/g              //匹配任意不在括号中的字符集中的字符;
[ ]也可以配合? * + {} 来使用; 如[a-z]+ 匹配至少一个[a-z]范围内的任意一个;

  

2. ^

俩种用法:

1.放在[ ] 内 表示非

var exp = /[^a-zA-Z]/g              //匹配任意不在括号中的字符集中的字符;

2.放在[ ] 外,表示行首匹配

var exp = /^\d/g;                   //规定行首必须是数字     
var str = '123qq';                  
console.log(exp.test(str));         //行首为数字1,返回true;  
console.log(exp.lastIndex);         //此时lastIndex 为1
console.log(exp.test(str));         //从下标为1的位置开始匹配,虽然下标为1的位置是数字,但却不是行首,返回false;

  

3. $

表示行尾匹配,用法与^ 相近

^ 和 $ 合用

var exp = /^\d\d$/g;                //规定行首和行尾必须是数字
var str = '12';
var str2 = '123';console.log(exp.test(str));     // trueconsole.log(exp.lastIndex);     // 2console.log(exp.test(str));     //falseconsole.log(exp.lastIndex);     //0console.log(exp.test(str));     //trueconsole.log(exp.test(str2));    //false     //exp中规定了行首行尾为数字,中间无内容

  

4. .

匹配除换行符外的任意字符(当点放在[ ]中是,没有特殊意义)

var exp = /./g;
var str = 'a';
console.log(exp.test(str));
=>    true

  若想匹配它本身.

var exp = /\./g;

  

5. |

择一匹配(管道符号) 表示或

var exp = /a|b/g;
var str = 'a';
console.log(exp.test(str));
=>    true

  数量词的匹配:默认都是贪婪匹配

6. ?

匹配0个或者1个

7. *

匹配0个或者多个

var exp = /a*/g;
var str = 'aaaaa';console.log(exp.test(str));         //trueconsole.log(exp.test(str));         //true

  

8. +

匹配1个或多个

var exp = /a+/g;
var str = 'aaaaa';console.log(exp.test(str));         //trueconsole.log(exp.test(str));         //false

  

9. {n}

匹配n个,只能是n个

10. {n,}

匹配至少n个

11. {n,m}

匹配至少n个,最多m个

基本的正则表达式验证

写一个正在表达式,判断手机号是否合法
var exp = /1[34578]\d{9}$/g;
var str = '13979318939';console.log(exp.test(str));
=> true
写一个正在表达式,判断邮箱是否合法
var exp = /^\w{3,15}@[\w-]+\.(com|cn|net|org|edu|com\.cn)$/gi;
var str = '133_d@cn.com.cn';console.log(exp.exec(str)[0]);
=>  133_d@cn.com.cn   
写一个正则表达式,判断图片的地址是否合法
var exp = /^(http|https):\/\/.+\.(jpg|jpeg|gif|png)$/gi;
var str = 'http://3323498dsfledf.png';console.log(exp.exec(str)[0]);
=>  http://3323498dsfledf.png
写一个正则表达式,爬取一堆字符串中的所有图片地址
var exp = /http:\/\/[^:]+\.(jpg|jpeg|gif|png)/gi;
写一个正则表达式,将字符串中的重复去掉
var exp = /(.)\1+/gi;
var str = "aabbccdd";   console.log(str.replace(exp,'$1'));
=>  abc

  

分组
其中分组体现在:所有以(和)元字符所包含的正则表达式被分为一组,每一个分组都是一个子表达式,它也是构成高级正则表达式的基础。如果只是使用简单的(regex)匹配语法本质上和不分组是一样的,如果要发挥它强大的作用,往往要结合回溯引用的方式。var str = '123-mm';
var strReg = str.replace(/(\d+)-([A-Za-z]+)/g,'$2');
console.log(strReg)//mm  上面那段$2这个就是表示正则第二组个匹配到的内容

  

 

方法

1.search( )
str.search(exp);检索与正则表达式相匹配的第一个匹配项的索引。返回值: 索引 ,没有返回-1;

  注:search( )不支持全局,每次调用总是从0开始查找.加不加g都一样

2.match( )
str.match(exp);把满足正则表达式的所有字符串一起返回返回值: 数组 ,没有返回null;var str = "abc134ABC244co9";console.log(str.match(/\d+/gi));            //获取str中的所有数字的数组
=>  ["134","244","9"]

  注:如果想获取所有的满足的,应该使用全局g,使用全局的时候,分组的信息则拿不到

3.replace( )
str.replace(exp,newStr);将正则表达式替换返回值: 替换之后的字符串var str = "123aaa244";console.log(str.replace(/\d/gi,""));        //将str中的数字全部去掉
=>  aaa     写一个正则表达式,将字符串中的重复去掉
var exp = /(.)\1+/gi;
var str = "aabbccdd";   console.log(str.replace(exp,'$1'));
=>  abc  

  

4.split( )
str.split(exp,length);length:可选参,切出来的数组的最大长度使用split 拆分成字符串数组返回替换之后的字符串var str = "102dsfe00dfefsf55";
var exp = /\D+/gi;                              //用所有非数字来切割console.log(str.split(exp));    
=>  ["102","00","55"]

 https://www.cnblogs.com/moqing/archive/2016/07/13/5665126.html

 

 

/*** @description:万能判断* @param {type}* value/判断的焦点* type:   1/false(默认undefind也是false) 2/与焦点比对类型(小写)* @return:1/焦点类型(小写)                2/boolean*/
function checkType(value, type) {const prototypeString = Object.prototype.toString.call(value)const typeString = prototypeString.replace(/\S*\s|]/gi, '').toLowerCase()return type ? type == typeString : typeString
}
export default checkType

 

  

匹配出现a或者b组合一起至少3次以上/(a|b){3,}/,匹配aaa,bbb,aab,baa,bba,bab等等

  

 

 

 

正则表达式------捕获性分组,非捕获性分组,前瞻,后瞻捕获性分组
javascript中捕获性分组是以小括号()来实现,捕获性分组工作模式()会把每个分组里匹配的值保存起来。比如利用捕获性分组把 hello world 互换成 world hello:方法一:通过exec函数var str = 'hello world';            //首先创建好字符串
var pattern = /([a-z]+)\s([a-z]+)/; //先通过正则匹配这个字符串,用分组模式来获取这两个单词
var arr = pattern.exec(str); // exec方法返回的是一个数组,包含匹配到的字符串以及分组(也称子串)里的值console.log(arr); //['hello world','hello','world']  
console.log(arr[0]); //'hello world' 匹配到的字符串
console.log(arr[1]); //'hello' 第一个分组([a-z]+)的值
console.log(arr[2]); //'world' 第二个分组([a-z]+)的值//这时候两个分组的值都得到了,接下来用字符串拼接法实现互换
var n_str = arr[2]+' '+arr[1];
console.log(n_str) //world hello方法二:通过属性$1-9var str = 'hello world';            
var pattern = /([a-z]+)\s([a-z]+)/; 
pattern.test(str); //这个地方必须运行正则匹配一次,方式不限,可以是test()、exec()、以及String的正则方式console.log(RegExp.$1) //'hello' 第一个分组([a-z]+)的值
console.log(RegExp.$2) //'world' 第二个分组([a-z]+)的值var n_str = RegExp.$2+' '+RegExp.$1;
console.log(n_str) //world hello方法三:通过String的replace()var str = 'hello world'; 
var pattern = /([a-z]+)\s([a-z]+)/; 
var n_str = str.replace(pattern,"$2 $1"); //这里的$1、$2与方法二里的RegExp.$1、RegExp.$2作用是相同的。
console.log(n_str) //world hello非捕获性分组:(?:)
非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。比如利用非捕获性分组获取字符串000aaa111,而且只返回一个值为aaa111的数组://先看用捕获性分组匹配会返回什么
var str1 = '000aaa111';             
var pattern = /([a-z]+)(\d+)/; //捕获性分组匹配
var arr = pattern.exec(str1);  
console.log(arr) //['aaa111','aaa','111']   结果子串也获取到了,这并不是我们想要的结果//非捕获性分组
var str2 = '000aaa111';
var pattern2 = /(?:[a-z]+)(?:\d+)/; //非捕获性分组匹配
var arr2 = pattern.exec(str2);  
console.log(arr2) //['aaa111']  结果正确  前瞻:(?=)和(?!)
前瞻分为正向前瞻和反(负)向前瞻,正向前瞻(?=表达式)表示后面要有什么,反向前瞻(?!表达式)表示后面不能有什么。前瞻分组会作为匹配校验,但不出现在匹配结果字符里面,而且不作为子匹配返回。正向前瞻匹配一批图片格式:
//正向前瞻,匹配.jpg后缀文件名
var str = '123.jpg,456.gif,abc.jpg';
var partern = /\w+(?=\.jpg)/g; //正向前瞻匹配
console.log(str.match(partern)); //['123', 'abc']   返回结果正确,没有匹配456.gif反向前瞻匹配一批字母加数字:
//反向前瞻,匹配3个及以上的a,而且后面不能有000的字符
var str = 'aaa000 aaaa111 aaaaaaa222';
var partern = /a{3,}(?!000)/g; //反向前瞻匹配
console.log(str.match(partern)); //['aaaa', 'aaaaaaa']   返回结果正确,没有匹配aaa000前瞻,可以放在位置不固定,可前匹配和后匹配,如:/(?=.jpg)\w+/g;后顾:(?<=)和(?<!) —JavaScript不支持
后顾分为正向后顾和反(负)向后顾,正向后顾(?<=表达式)表示前面要有什么,反向后顾(?<!表达式)表示前面不能有什么。
/正向后顾
(?<=abc) //前面需要有abc//反向后顾
(?<!abc) //前面不能有abc名词解释:前瞻 = 先行断言
(?=) 正向前瞻 = 正向零宽先行断言
(?!) 反向前瞻 = 负向前瞻 = 负向零宽先行断言后顾 = 后发断言
(?<=) 正向后顾 = 正向零宽后发断言
(?<!) 反向后顾 = 负向后顾 = 负向零宽后发断言备注,总结
可以通过多个前瞻组合一块控制,字符串里边必须包含指定字符。
示例:
(?=.[0-9].)(?=.[A-Z].)(?=.[a-z].).{6,20} 可以匹配包含大写字母,小写字母,数字

  

转载于:https://www.cnblogs.com/smzd/p/8798805.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Promise实践

var doSomething function() { return new Promise((resolve, reject) > { resolve(返回值); }); };let doSomethingElse function() { return 新的值; }doSomething().then(function () { return doSomethingElse(); }).then(resp > { console.warn(resp); console.wa…

JsonBuilder初出茅庐

互联网这股东风不久前刮到了甘凉国&#xff0c;国王老甘独具慧眼&#xff0c;想赶紧趁着东风未停大力发展移动互联网&#xff0c;因为他笃信布斯雷的理论&#xff1a;“站在风口上&#xff0c;猪都能飞起来”。无奈地方偏僻落后&#xff0c;国内无可用之才啊。老甘一筹莫展的低…

Nexus介绍

转自&#xff1a;https://www.cnblogs.com/wincai/p/5599282.html 开始在使用Maven时&#xff0c;总是会听到nexus这个词&#xff0c;一会儿maven&#xff0c;一会儿nexus&#xff0c;当时很是困惑&#xff0c;nexus是什么呢&#xff0c;为什么它总是和maven一起被提到呢&#…

vue-cli 打包

一项目打包 1 打包的配置在 build/webpack.base.conf.js文件下 常量config在vue/config/index.js 文件下配置&#xff0c;__dirname是定义在项目的全局变量&#xff0c;是当前文件所在项目的文件夹的绝对路径。 2 需要修改vue/config/index.js 文件下的将build对象下的assets…

乘风破浪:LeetCode真题_010_Regular Expression Matching

乘风破浪&#xff1a;LeetCode真题_010_Regular Expression Matching 一、前言 关于正则表达式我们使用得非常多&#xff0c;但是如果让我们自己写一个&#xff0c;却是有非常大的困难的&#xff0c;我们可能想到状态机&#xff0c;确定&#xff0c;非确定状态机确实是一种解决…

vue项目工程中npm run dev 到底做了什么

npm install 安装了webpack框架中package.json中所需要的依赖 2.安装完成之后&#xff0c;需要启动整个项目运行&#xff0c;npm run 其实执行了package.json中的script脚本&#xff0c;npm run dev的执行如下 3.底层相当执行webpack-dev-server --inline --progress --confi…

bat等大公司常考java多线程面试题

1、说说进程,线程,协程之间的区别 简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程.进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高.线程是进程的一个实体,是cpu调度和分派的基本单位,是比…

offset系列,client系列,scroll系列回顾

一 scroll系列属性 ——滚动1 scrollHeight/scrollWidth 标签内部实际内容的高度/宽度ele.scrollHeight 有两种情况&#xff0c;当内容超出盒子范围后&#xff0c;返回的是内容的高度&#xff0c;包括padding&#xff0c;从顶部内侧到内容的最外部分。当内容不超出盒子范围…

项目开发中的自我总结

最近忙的要死,因为新开发了两个项目.现在已经测试完毕了,准备部署到线上了. 然后不能白忙活吧,忙活完也得写点总结和经验吧,以后也有个记录. 1.一个bootstrapjquerylayuilaravel 5.4开发的一个后台系统 比较朴素 2.一个前后端分离的vuelaravel 5.4 开发的商家系统 我只负责后端…

数组黑科技(偏性能方面)未完待更新...

数组去重最优解&#xff1a;Array.prototype.unique function () {var tmp new Map();return this.filter(item > {return !tmp.has(item) && tmp.set(item,1);})}搭配使用 Array.from(foo); // ["f", "o", "o"]let s new Set([f…

控制台添加log4net

1.添加nuget包 log4net 2.app.config配置 <?xml version"1.0" encoding"utf-8"?> <configuration> <configSections><section name"log4net" type"log4net.Config.Log4NetConfigurationSectionHandler, log4net&quo…

touchWX 自定义组件以及传值

创建如图文件 index.wxc: <template><view class"wx-test" bindtap"handleTap">{{ msg }}{{dataIndex}}</view> </template> <script>export default {properties: {dataIndex: {type: String,value: default value,}},data…

vue 初始框架

VueJs讲解初始框架 一、启动项目 第一步&#xff1a;cmd进入项目文件里&#xff0c;运行npm run dev 启动项目 这里说明启动端口号是8080 第二步&#xff1a;往页面输入&#xff1a;localhost:8080 二、解析渲染步骤 先看整体框架样式和index.html&#xff1a; 从上面我…

Country Road Aizu - 2104

题目链接&#xff1a; https://vjudge.net/problem/Aizu-2104 题解&#xff1a; 咋说啊&#xff0c;一言难尽&#xff0c;花了半小时写出来的&#xff0c;卡了十分钟才恍然大明白是排序。 具体就是让每个村子都通上电&#xff0c;变压器在的村子&#xff0c;与变压器连线点线长…

IdentityServer4【QuickStart】之使用asp.net core Identity

使用asp.net core Identity IdentityServer灵活的设计中有一部分是可以将你的用户和他们的数据保存到数据库中的。如果你以一个新的用户数据库开始&#xff0c;那么&#xff0c;asp.net core Identity是一个选择。这个示例演示了如何在IdentityServer中使用asp.net core Ientit…

vue demo1

1.开发工具 试过sublime&#xff0c;现在转战vscode&#xff0c;觉得很顺手&#xff0c;总之啥工具习惯就好。 vscode用着不错的插件&#xff0c;推荐安装。 2.项目目录介绍 vue-cli生成的项目目录有点多&#xff0c;初看有点懵&#xff0c;梳理一下会好很多。 ├── ind…

CentOS下防御或减轻DDoS攻击方法(转)

查看攻击IP 首先使用以下代码&#xff0c;找出攻击者IP netstat -ntu | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -n 将会得出类似如下的结果&#xff1a; 1 114.226.9.132 1 174.129.237.157 1 58.60.118.142 1 Address 1 servers) 2 118.26.131.78 3 123.125.1…

vscode - 添加背景图片

首先&#xff0c;CtrlShiftP安装backround &#xff0c; 而后重启vscode会有默认的背景图片 修改背景图&#xff0c;可自定义三张 具体请看gif图 最开始时&#xff0c;发现png根本不是全透明&#xff0c;用ps处理了一下&#xff08;下列所有操作均字母组合&#xff09; 1.1 Ctr…

关于Vue.use()详解

问题 相信很多人在用Vue使用别人的组件时&#xff0c;会用到 Vue.use() 。例如&#xff1a;Vue.use(VueRouter)、Vue.use(MintUI)。但是用 axios时&#xff0c;就不需要用 Vue.use(axios)&#xff0c;就能直接使用。那这是为什么呐&#xff1f; 答案 因为 axios 没有 install。…

分布式工具的一次小升级⏫

前言 之前在做 秒杀架构实践 时有提到对 distributed-redis-tool 的一次小升级&#xff0c;但是没有细说。 其实主要原因是&#xff1a; 秒杀时我做压测&#xff1a;由于集成了这个限流组件&#xff0c;并发又比较大&#xff0c;所以导致连接、断开 Redis 非常频繁。 最终导致获…