JavaScript标准库系列——RegExp对象(三)

目录

导语

1.理解正则表达式

2.模式的规则

3.字符串和正则实例的属性和方法

4.检索实例

5. 小结


导语

正则表达式是处理字符串的一门艺术手法,应用场景经常出现在表单验证部分;
JavaScript高级程序设计一书开篇提到,JavaScript这门语言最原始的应用就是处理输入验证操作,所以正则表达式从JavaScript诞生那一刻就与其结下不解之缘;


1.理解正则表达式

正则表达式(Regular Expression)可以理解为规则表达式,即以表达式的形式定义一项规则,然后根据这一规则去检索字符串,最后根据匹配结果进行后续的处理操作(判断、获取或是替换等);
正则表达式根据创建形式的不同,可分为字面量和构造函数RegExp对象;
1.1 字面量方法
正则表达式的字面量方法由正则模式(pattern)和修饰符(flags)构成;

var regExp = /pattern/flags;

1.2 RegExp构造函数
可以通过RegExp这一构造函数去创建一个正则表达式对象;

var regExp  = new RegExp('pattern','flags')

需要注意的二者不同在于:字面量采用/pattern/,而正则对象采用"pattern"字符串;所以出现转义字符时,构造函数创建的正则对象的参数需要进行转义;

var regExp = /\hello\/;
var regExp1 = new RegExp('\\hello\\');

1.3 flags规则
模式的规则将会在下文单独开一章讲解,先讲述flags规则;
正则表达式可以添加3个修饰符从而起到改变检索规则的作用;

g:表示全局模式,检索所有字符串,而不是发现第一个匹配项时停止检索;
i:表示忽略大小写模式;
m:表示多行模式,进行多行的检索;


2. 模式的规则

模式的规则是正则表达式的核心部分,模式可有普通字符(打印字符和非打印字符)和特殊字符构成;

2.1 普通字符
普通字符由所有数字、中外文字母、标点符号和非打印字符构成;
非打印字符包括:

\cx:control-x
\n:换行符;
\r:回车符;
\t:制表符;
\v:垂直制表符;
\f:换页符;
\s:空白字符,等价于[\f\n\r\t\v]

2.2 特殊字符
所谓特殊字符,就是具有特殊含义的字符,包括:限定符、定位符、类型符、分组符、条件符、非获取匹配符等

限定符
限定符限定一个正则表达式出现次数;

*:匹配前面子表达式任意次,等价于{0,};
+:匹配前面子表达式1次以上,等价于{1,};
?:匹配前面子表达式0次或1次,等价于{0,1};
{n}:匹配子表达式n次;
{n,}:匹配子表达式n次以上;
{n,m}:匹配子表达式n~m次之间,默认是贪婪模式取m次,当在该限定符后面添加?开启非贪婪模式;这个?可应用于所有限定符后;

定位符
定位符能够高效匹配到字符出现位置;

^:匹配字符串开始的位置,注意在[]中表示取反匹配;
$:匹配字符串结尾的位置;
\b:匹配字符边界;

类型符
类型符是小羊自己为了记忆方便定义的,就是可以匹配不同的数据类型;

.:匹配除换行符的任意字符;
\w:匹配任何单词字符,等价于[a-zA-z0-9];
\d:匹配数字;

分组符

():将表达式放入圆括号成为子表达式;

条件符

|:分支条件,匹配位于|两侧的字表达,相当于或;

非获取匹配符
非获取匹配符指的是匹配表达式但不获取匹配结果;

(?:pattern):匹配 pattern 但不获取匹配结果;
(?=pattern):正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串;
(?!pattern):负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串

取反操作
下面这几个都是对应先前特殊字符的取反操作;

\D
\W
\B
\S
[^pattern]

反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式;

Is is the cost of of gasoline going up up?
/\b([a-z]+) \1\b/gi
匹配Is is和up  up

3.字符串和正则实例的属性和方法

3.1 字符串的方法

match:接受正则表达式,返回匹配结果;

replace:接受两个参数,第一个为正则,第二个为替换值(也可以是一个函数),返回新字符串,不改变原字符串;

3.2 正则实例的属性和方法
正则实例的属性
正则实例的属性主要包括ignoreCase、global、multiline返回是否设置修饰符的布尔值,lastIndex返回下一次开始搜索的位置,source返回正则表达式的字符串形式;


正则实例的属性

test:传入一个字符串,返回布尔值表示匹配结果的判断;带有修饰符g时,每一次test方法都从上一次结束的位置开始向后匹配;
exec:传入一个字符串,返回匹配结果的数组;


3.检索实例

下面根据目前常用的表单验证时用到的正则,给出几个检索的案例;解;
3.1 手机号码检索

function isPhoneNum(str){
                //020-80723000
                //07518869865
                //13832132341
                var regExp = /^0\d{2}[-]?\d{8}|^0\d{3}[-]?\d{7}|^1\d{10}/
                return regExp.test(str);
            };

3.2 E-mail检索

    function isEmail(str){
                var regExp =  /^[a-zA-Z]\w*@[0-9a-zA-Z]+\.[a-zA-Z]+/;
                return regExp.test(str)
            };

3.3 密码检索

            function isValidPassword(str){
                //长度6-20个字符,包括大写字母、小写字母、数字、下划线至少两种
                if(/\W*/.test(str)){
                    return false
                }else if(/\w{0,5}|\w{21,}/.test(str)){
                    return false;
                }else if(/^\d+$|^[a-zA-Z]$|^_+$/.test(str)){
                    return false
                }else{
                    return true;
                }
            }

3.4 用户名的检索

            function isValidUsername(str){
                //长度为6-20个字符,只能包括字母数字和下划线
                var regExp = /^\w{6,20}$/
                return regExp.test(str);
            };

3. 5 Url检索

https://www.baidu.com:8080/index.html#q=hello

https://   ([a-zA-Z]*:\/\/)?
www.baidu.com   \S+
:8080   (:\d*)?
/   \/
index.html   \S*
#q=hello   (#.*)?

5. 小结

通过本文,我们可以了解到:

  • 正则表达式可以理解为根据规定的规则,去检索字符串然后根据匹配结果进行后续的处理,处理可以包括判断、获取和替换;
  • 正则表达式的创建方法可以使用字面量和构造函数形式;两种方法都是由正则模式和修饰符构成,不同之处在于构造函数需要以字符串形式传参;
  • 修饰符规则部分可以传递三个参数,分别为gim,可以起到改变检索规则的作用;
  • 模式规则作为正则表达式,由普通字符和特殊字符构成;
  • 普通字符包括打印字符和非打印字符;
  • 特殊字符即那些具有特殊含义的字符,主要包括限定符定位符类型符分组符分组符条件符非获取匹配符等;
  • 正则表达式以实例形式出现时,拥有自己的属性和方法,并且字符串的一些方法与正则表达式也存在密切的关系;
  • 字符串的方法包括:matchreplace方法;
  • 正则实例的属性和方法包括:ignonreCaseglobalmultilinetestexec等;
  • 最后给出了几个正则表达式的应用实例,包括手机号码、密码、用户名、E-mail和URL检索

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • 一、概述 正则表达式(regular expression)是一种表达字符串结构的方法,有点像字符串的模版,常常用...
    周花花啊阅读 572评论 0 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,231评论 0 4
  • 秋天的雨滴 润湿了思念的眼睛 把你的世界 带入梦境 未知 向往 你在一个地方 用秋的落叶堆积成长的种子 我在一个...
    彩彩的熊阅读 323评论 4 2