js 正则中冒号代表什么_javascript中正则表达式语法详解

好久都没有写博客了,主要是太懒了,尤其是在阳春三月,风和日丽的日子,太阳暖暖的照在身上,真想美美的睡上一觉。就导致了这篇博客拖到现在才开始动笔,javascript的正则这一块也不是什么新的东西,主要是以前本人一遇到写正则的需求就开始头大,头疼,网上剽窃,东拼西凑,反正就是各种不适应,所以我打算系统的把正则表达式看一遍,一来是自己有所提升,这一块知识点的查漏补缺,二来是给大家分享一下。好了,下面我们直接进入主题:

正则是匹配字符串特定模式的一种表达式,官方是这样说的,但我的理解不外乎就是匹配字符窜嘛,举个例子大家就明白了。比如我们要验证邮箱,试想一下如果我们不用正则来匹配,直接用代码,循环,判断各种捣鼓来验证还真是一件非常麻烦的事情。如果用正则怎么来做了,这里为了照顾小白(当然我也是重小白走来的,所以小白很单纯,小白很善良,小白很伟大)我就写伪正则来描述: 所有0-9或者a-z或者A-Z的字符出现一次到多次 加上(就是前面出现了的所有0-9...的字符跟上) "."或者"_"出现0次或者1次,然后在跟上 "@"符号 跟上 xxx.xx这种格式。 不知道我这样来描述各位亲有没有明白一点,不明白也不要紧,这里我只是随便举个列子,提一下,在下文的某个位置我会专门一步一步分析几个非常复杂的正则表达让大家能够很快的明白正则的语义。

上面举了一个邮箱地址的正则表达式,比如这一窜/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;要看懂坑爹的这一窜,还得从基础一步一步的来。首先给大家介绍javascript经常使用正则的对象和方法:

RegExp 这个是正则对象, 比如匹配字符串"1234"中的"23"可以这样玩: (new RegExp("23")).test("1234"); //out true;

当然正则对象还有一种写法:

var reg = /23/; reg.test("1234") //out true;

RegExp.test(String) ; //这个方法上面的用上了,匹配字符串是否为指定格式

RegExp.exec(String); //返回查询的值

var str = "123 aa cat Cat caT";

var reg = /cat/i;

reg.exec(str); // out "cat" 如果有则返回,没有的话就返回null

String.search(RegExp) ; // 返回索引位置,类似indexOf()

var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

var reCat = /cat/gi;

alert(data.search(reCat)); //out "23"

String.replace(RegExp, String); // 将字符串替换成另外一个字符窜,RegExp指定的格式,String要替换的字符串

var str = "1234aa67aa89";

var reg = /aa/gi;

str.replace(reg, "") ; //out "12346789"

String.split(RegExp) ; // 将字符串拆分成数组

var str = "1234aa67aa89";

var reg = /aa/gi;

str.split(reg) ; //out [1234, 67, 89]

String.match(RegExp); //将指定格式的字符串以数组的方式返回

var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

var reCat = /cat/gi;

var arrMactches = data.match(reCat); // out ["Cat", "cat"]

上面的的方法是在字符串过滤操作中经常用到的方法, 当然还有一些我没有全部列举出来,用到了在去差API也不迟,好了我们熟悉了操作正则的这些方法之后我们紧接着正则表达式了,所谓表达式意思就是用一些字符按照先后顺序组合在一起表示的一层含义,所以我们先要重正则表达式的元字符说起,其实元字符就相当于javascript语言的关键字,比如你定义变量不能这样干 var if = "xxxx"; 正则有一下一些元字符:{ [ ^ | $ ] } ? * + . 这些都是正则的元字符,这里我就不解释意思了,用到了时候再来分析。如果大家想知道可以找度娘

字符类

字符类是用于测试字符串的组合, 将一些字符放入方括号中,就可以有效的告诉正则表达式去匹配第一个,第二个,第三个...比如/[abc]/,这个又称之为简单类

简单类:

var str = "cat 123 caT 234 cAt 345 CaT";

var reg = /cat/gi;

str.match(reg) ; //out ["cat", "caT", "cAt", "CaT"]

负向类和范围类: 这里要解释下"^" "-"这两个符号, "^"这个符号的意思就是取反,而"-"是范围, g表示全局,i表示忽略大小写,/[^2-3a-z]+/gi 所以这句话的意思就是: 除了2到3和a到z的所有字符出现1次到多次,并且在全局中忽略大小写。其实细心的看官这里还会发现一个知识点, 2-3a-z这一句其实是一个组合,又称之为组合类,下面的这个实例就用到了正则的几个知识点: 1.负向类,意思就是取反; 2. 范围类; 3.组合类,相当于逻辑运算符的并且&&

var str = "cat123caT234cAt345CaT";

var reg = /[^2-3a-z]+/gi;

str.match(reg); //out ["1", "4", "45"]

预定义类:

代码 等同于 匹配

. [^\n\r] 除了换行和回车符之外的任意字符\d [0-9] 数字\D [^0-9] 非数字字符\s [\t\n\x0b\f\r] 空白字符\S [^\t\n\x0b\f\r] 非空白字符\w [a-zA-Z_0-9] 单词字符,所有的字符数字下划线\W [^a-zA-Z_0-9] 非单词字符

量词:量词是可以指某个特定模式出现的次数,可以是硬性量词,比如某个字符出现三次,也可以是软性量词,比如某个字符至少出现一次。正则中的量词有以下这些

贪婪量词:

? 出现零次到一次

+ 至少出现一次或者多次

* 出现0次到多次

{n} 出现n次

{n,m}出现n次到m次

{n,} 至少出现n次或者n+次

说道量词的话有贪婪, 惰性和支配量词,以上的这些量词都是贪婪量词,由于javascript正则引擎对支配量词支持不是很好,所以我们这里重点来说贪婪和惰性量词,先把惰性量词列出来之后在来说说他们的关系和区别

惰性量词:

?? 出现零次到一次

+? 至少出现一次或者多次

*? 出现零次到多次

{n}? 出现n次

{n,m}? 出现n次到m次

{n,}? 至少出现n次或者n+次

贪婪量词在匹配字符串的时候首先看是否匹配字符串,如果没有找到匹配的则去掉字符串中最后一个字符再次尝试,整个过程一直重复,直到字符串为空时停止。而惰性量词正好相反,首先查看字符串中第一个字符是否匹配,否则在读入下一个字符在进行匹配,直至重复这个过程到读入整个字符窜都不匹配时停止。可能说了这些多还是不太明白,下面我会举个例子帮助大家理解

var str = "abbbaabbbaaabbb1234";

var re1 = /.*bbb/g; //贪婪匹配

var re2 = /.*?bbb/g; //惰性匹配

alert(str.match(re1));

alert(str.match(re2));

亲,你觉得第一个alert会输出什么呢,如果是[abb, aabbb, aaabbb]的话的, 那么恭喜你答错了,前面说过*是贪婪量词,它在匹配的时候会首先匹配整个字符串,是从字符串的尾部操作的,当去掉字符1的时候就发现剩下的字符串"abbbaabbbaaabbb"已经达到它匹配的要求了,所以它返回的结果就是字符串"abbbaabbbaaabbb", 而第二个alert为啥子会打印[abbb,aabbb,aaabbb]呢,我们再来一步一步的看,这个是惰性匹配,所以它在匹配字符串的时候是从字符串开始的部分取出第一个字符进行匹配,发现不行,在取下一个,还是不行,直至取到了"abbb".好,现在发现匹配了,然后将这个装进数组, 在从剩下的字符串里面取,直至最后将符合指定模式的子字符串装进数组,所以最后就返回[abbb,aabbb,aaabbb]。只要稍微花点心思动动手还是很容易就理解了。好了,关于正则的量词的一些知识点就讲到这里,万里长征才走一半,下面接到说正则的复杂模式,上面说到的字符类那一块都是正则的简单模式,只能做一些简单的字母,数字,汉字,长度等效验,如果在掌握了下面的复杂模式就可以非常牛逼的匹配各种复杂,蛋痛的字符串模式了,比如邮箱,身份证验证,标签过滤,包括jquery类选择器,sizzle引擎过滤器。好了,直接切入主题吧:

复杂分组

分组模式:分组模式就那么回事我用一个例子或许你一下子就豁然开朗了

//如果要匹配"andand"的怎么做呢,你也许会说可以这样干

var str = "asdfandandcxhksdf";

var reg = /andand/gi;

alert(reg.test(str)); //output true

//好的,亲,这样匹配也是可以的,但是有不知道多少and怎么办呢,

//不可能全部加在正则表达式里面吧,此时分组的便捷性就体现出了

//出了它的优势,我们可以这样干:

var reg = /(and){2}/g; //注意这里()是元字符分组的意思,{2} 是量词,贪婪量词

捕获分组模式:指的是RegExp.$1这个属性的值,这个值就是正则中一个分组的值,在这个对象RegExp中,定义了最多支持RegExp.$1-RegExp.$100个分组值,还是来个例子吧

var str = "asdffirstfirstsecondsecond1234";

var reg = /(first){2}(second){2}/gi;

reg test(str); // 要必须匹配之后才有下面的值

alert(RegExp $1); //output "first"

alert(RegExp $2); //output "second"

非捕获分组模式:上面说了捕获分组,那非捕获分组其实就是不让RegExp.$1引用了,这里要说一点的是在捕获分组中RegExp.$1会创建正则的反向引用的存储空间,所以在进行捕获分组时会有更多的空间开销,还会降低匹配速度。那现在晓得非捕获分组的好处了吧。简单的说就是在正则表达式()里面加上一个问号和冒号/(?:first)/,语法就是这样的,还是看代码吧

var str = "#123456789";

var reg = /#(?:\d+)/;

reg.test(str);

alert(RegExp.$1); //output "" 注意这里取消了反向引用就为空了

候选模式:候选我的理解就是或者,举个例子,比如你要对一个表达式同时匹配"red", "black"的话怎么做呢, 如果是在以前的话就要写两个正则来进行分别匹配,而加入了候选就可以非常方便的操作了,还是上代码吧

var str1 = "111red222";

var str2 = "111black111";

var reg = /(red|black)/;

alert(reg.test(str2)); //output true

alert(reg.test(str1)); //output true

前瞻模式:有时候我们希望某个字符分组出现在另外一个字符分组之前才去捕获,这相当于是在正则里面做判断了, 果然是高级功能,灰常强大,我在写正则的时候也没有用到过, 只是书上都说了, 我还是把它搬到这里来出哈风头。 上代码吧

/*

*前瞻又分为正向前瞻和反向前瞻

*下面我会用代码加注释的方式加以描述

*/

//正向前瞻

var str1 = "bedroom";

var str2 = "bedding";

var reg = /(bed(?=room))/; //符号?=来表示正向前瞻,表示在字符串"bedroom"中如果bed后面有room的字符才捕获,顺序执行

alert(reg.test(str1)); //output true

alert(RegExp.$1); //output "bed" 捕获到反向引用bed字符串

alert(reg.test(str2)); //output true

//反向前瞻

var reg = /(bed(?!ing))/; //符号?!来表示反向前瞻,表示在字符串"bedding"中如果有"ing"子字符串才捕获,逆序执行

alert(reg.test(str2)); //output true

alert(RegExp.$1); //output "bed" 捕获到反向引用bed字符串

alert(reg.test(str1)); //output true

alert(RegExp.$1);

/*以上代码如果各位亲测试不通过的话那就是正则引擎不支持前瞻*/

边界模式:这个模式很重要也很常用,比如去掉字符串的首尾空格,那下面说说几种边界的可能:

^行的开始 $行的结尾 \b单词的边界 \B非单词的边界

//用一个例子来说明边界

var str = " xiaoming "

var reg = /(^\s+)|\s+$/g; //(^\s+)去除字符串开始位置的空格,\s+$去除字符串尾部空格,|这个符号想必不用我说了吧,候选

var str = str.replace(reg, "");

alert(str); //output "xiaoming"

多行模式:这个也是正则复杂模式里面最后一个模式了,也不经常用,不管你信不信,反正我是信了,还是直接来看代码吧

//请看下面这个实例,\n在前面的预定类,表示换行

var str = "first\nsecond\nthread";

var reg = /^(\w+)/g;

alert(str.match(reg)); //output 若不指定m行的话就输出"first"

var reg = /^(\w+)/gm;

alert(str.match(reg)); //output [first, second, thread]

到目前为止正则表达式的语法,规则各种都已经说完了,如果各位小白认真的看到这里,我们在来分析文章开头说的邮箱验证表达式就非常容易了。好,现在我们就来一步一步的分析那个非常蛋痛的表达式,首先我们要来拆分这段表达式,我会用不同的颜色来表示这段表达式的每一段,这里就用到了一种思想,分而治之,太复杂的东西不利于直观的表达某些东西,所以拆分,打碎,各个击破:

/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/

1.([a-zA-Z0-9]+[_|\_|\.]?)* 这一段表示的是一个分组,分组()里面首先是[a-zA-Z0-9]意思是匹配字符串大小写字母数字,后面紧跟一个+,这个是贪婪量词,1次到多次,前面提到过的。[a-zA-Z0-9]+而这一段的意思就是说大小写字母数字匹配1次到多次,[_|\_|\.]?而这个呢是符号"_"或者"."出现0次到一次。整个这段表达式的意思就是所有大小写字母数字出现1次到多次,紧接着符号"_"和"."出现0次到一次,在把这两个条件加起来成为一个组,这个组的格式又可以出现0次到多次。

2.[a-zA-Z0-9]+ 这段就不用说了吧,上面也说了就是大小写字符数字出现1次到多次

3.@([a-zA-Z0-9]+[_|\_|\.]?)* 这个理解起来就简单了,以字符@开头上面那个分组出现0次到多次的这个格式

4.\.[a-zA-Z]{2,3} 这个表达式呢还是比较容易,也是以字符"."开头所有大小写字母出现两次或者三次

5./^$/ 这两个符号是表示从字符串的开始匹配到行的结束。

看到这里大家是不是对正则表达式的认识更深了一些呢, 如果还不行话在给大家分析一个实例吧 /^((0?[1-9])|((1|2)[0-9])|30|31)$/ 这个正则的意思是验证一个月的31天,正确格式是01、09和1、31。首先我们还是来拆分 /^((0?[1-9])|((1|2)[0-9])|30|31)$/

1.首先这个表达式中出现了三个黑色的"|"候选符号,意思就是说可以匹配四种情况

2.(0?[1-9]) 这个表达式是匹配 0出现0次或者一次紧接着跟上数字出现一次,这是一种情况,如:01, 09, 1, 9这些

3.((1|2)[0-9]) 这个分组表示的是1或者2出现一次紧接着跟上0-9出现一个,又是一种情况,如:10,19,20,29

4.30|31 这个就更简单了,30或者31只能出现一次。

到此这篇关于javascript中正则表达式语法详解的文章就介绍到这了,更多相关javascript正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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

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

相关文章

一个关于数学归纳法的悖论问题-续

上篇文章讲到一个悖论,这里解开悖论的什么面纱 上篇文章地址http://www.cnblogs.com/zhouyf/p/4583351.html 「游客没有输入任何新的信息」这个断言是错的。N1的情形不必说了,显然输入了新信息。对于N>1的情形,要注意,游客必须是当着所有人…

封装出现 用户.计算机,ES4封装WIN7出现[Administrator.计算机名]目录的可能解决方案...

受https://www.itiankong.net/thread-36634-1-1.html这个贴子中的思路启发,算是彻底解决了[Administrator.计算机名]目录的问题,打算把整理的方法贴出来,遇到问题的朋友也帮忙试一下是否有效。先说原理:这个问题的出现基本上和ES无…

自动化测试工具selenium python_Selenium自动化测试工具使用方法汇总

1、设置无头浏览器模式 from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options Options() chrome_options.add_argument(- -headless) chrome_options.add_argument(- -disable-gpu) class XX(object): self.driver webdriv…

数据库查找姓李的人_最通俗易懂的理解什么是数据库

1.什么是数据库呢?每个人家里都会有冰箱,冰箱是用来干什么的?冰箱是用来存放食物的地方。同样的,数据库是存放数据的地方。正是因为有了数据库后,我们可以直接查找数据。例如你每天使用余额宝查看自己的账户收益&#…

Android多媒体分析-通过MediaStore获取Audio信息

public void getAlldata() { ContentResolver cr getApplication().getContentResolver(); if (cr null) { return; } // 获取所有歌曲 Cursor cursor cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, …

怎么在anaconda上安装python_我是如何用Anaconda来管理Python的

Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。 Anaconda主要特点: 开源各个库之间的依赖性列出所需其他依赖包。多种开源库conda是包及其依赖项和环境的管理工具适用语言:P…

rdd分片 spark_Spark分区

一、分区的概念分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务的个数&#xf…

html5 防止脚本攻击,shell防ddos攻击脚本(二)

在上一篇shell防ddos攻击脚本(一)中,我给大家发了个脚本,那只是针对单机的,如果是在负载均衡下的话,很容易把自己的服务器ip给误封,所以这篇文章就给大家发个可以添加白名单的shell脚本.系统:centos 5.9 64位脚本内容:vi ip-dos-cc.sh#!/bin/bashnetstat -an| grep :80 |grep -…

python中配置opencv_在Windows中安装OpenCV-Python|四

目标 在本教程中,我们将学习在你的Windows系统中设置OpenCV-Python。 下面的步骤在装有Visual Studio 2010和Visual Studio 2012的Windows 7-64位计算机上进行了测试。屏幕截图展示的是VS2012。 从预编译的二进制文件安装OpenCV 下面的Python软件包将被下载并安装到…

uip UDPclient模式通信移植,当地port随机

现在移植UDPclient模式,测试广播地址. //udp_client.c /************************************************************************************************************** 文件名称: udp_client.c* 功能: uIP UDP客户端相关函数* 作者: cp1300139.com* 创建时间: 20…

react如何遍历并比较_[前端进阶] 这可能是最通俗易懂的React 渲染原理及性能优化...

如今的前端,框架横行,出去面试问到框架是常有的事。我比较常用React, 这里就写了一篇 React 基础原理的内容, 面试基本上也就问这些, 分享给大家。React 是什么React是一个专注于构建用户界面的 Javascript Library.一…

运用计算机计算包含排斥原理,离散数学包含及排斥原理.ppt

离散数学包含及排斥原理第三章 集合与关系 * 一、有限集的计数 一个集合若其组成集合的元素个数是有限的,则称作有限集。 设A1、A2为素个数分别记为|A1|,|A2| P96有限集记数有如下几个性质: a)|A1∪A2| ≤ |A1||A2| b)|A1∩A2| ≤min( |A1|,|…

基于git的工作流程

本文针对的是追求极致、快速的产品响应团队的。以下的观点和内容都是围绕这个主题,暂时不涉及个人学习和团队学习。 在说工作流程之间,想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里,同时有好多事件要解决。有的是产品迭代&a…

c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充

在C中,继承是一个对象自动获取其父对象的所有属性和行为的过程。通过继承,您可以重用,扩展或修改在其他类中定义的属性和行为。通过继承,可以实现函数重写以及多态。在C中,继承另一个类的成员的类称为派生类&#xff0…

超几何分布_常见概率分布

离散分布退化分布 若r.v. 只取常数值c,即 ,这时分布函数为: 把这种分布称为退化分布或者单点分布。伯努利分布 在一次实验中,事件A出现的概率为 ,不出现的概率为 ,若用 记事件A出现的次数,则 仅取值0或1,相应的…

spring 4.0 JUnit简单的Dao,Service测试

1.AbstractTransactionalJUnit4SpringContextTests 和AbstractJUnit4SpringContextTests。我们在测试用例类要继承两种中的一个。 AbstractTransactionalJUnit4SpringContextTests提供了数据库自动回滚,也就是说测试前和测试后数据库是一样的 AbstractJUnit4SpringC…

云起智慧中心连接华为_【转发】华为智慧屏HiLink控制联动,操作指南来了!

本文转自华为智慧生活APP -> 智能 -> 酷玩页面华为智慧屏HiLink控制联动,操作指南来了!一、基本控制通过华为智慧生活APP,您可以对已绑定华为账号的智慧屏进行基本控制,操作指南如下:① 在智慧屏上登录华为账号&…

中小学电教信息计算机管理员职责,中小学电教教师岗位职责

第1篇:电教教师岗位职责电教教师岗位目标责任书一、根据学校工作计划制定学校电教工作计划。二、根据学校需要,收集、编制电教教材和资料。三、管理好电教教室、器材和设施,严格执行器材的使用归还制度。四、电教器材使用设置合理&#xff0c…

python编程口诀_少儿Python编程中的算术与技巧

在儿童Python中,使用数值进行基本运算的情况很常见。加、减、乘、除都是内置的。加法和减法通过和-号执行。 在Python shell提示中可以输入基本的算术表达式,将它当作一个计算机来使用。像计算器一样,Python接受一组操作,当按下En…

struts学习

Structs2配置文件概述&#xff1a; <constant name"" value""></constant>详解&#xff1a;&#xff08;两个看不见的value都是设置true/false&#xff09; package的相关使用&#xff1a; &#xff08;name是包名。action相当于以前的servl…