本章介绍正则表达式的内容。正则表达式是一门独立的语言,它拥有自己的语法规则,在学习本章之前需要了解基本的语法规则。

正则表达式是通用的,意味着同样的语法规则可以适用于不同的编程语言,相同的正则表达式在Java,JS编程语言中功能是相同的。

正则表达式是复杂的,复杂性并不来源于它的语法,而是来源于看待字符串的方式。它将字符串分为若干部分,每个部分都匹配对应的规则。若可以将整个正则表达式拆分为若干部分,并逐个的进行分析,那么正则理解起来会非常简单。所以个人建议在初期时将每个部分用括号包裹起来,之后再将括号去掉。

正则表达式的功能是强大的,而且暂时是无可替代的。

正则表达式正是由于它的通用性,所以在实际应用中是最简单的,因为可以从网络上拷贝现成的正则语法。为了保证程序的健壮性,至少需要读懂正则,有时需要在拷贝的基础上修改,这是学习正则的最低要求。

正则表达式的内容一般由三部分组成

  1. 与正则表达式相关的对象,在Java中为Pattern和Matcher,在JS中为RegExp,使用这些对象并不复杂,关键点还在于正则的语法。
  2. 字符串中支持正则的方法,以及如何使用它们。
  3. 正则的语法规则。在本书中只是简述,想更深入了解参考《Introducing Regular Expressions》,《Regular Expressions Cookbook, 2nd Edition》等书。

原书有四个小节,它的结构如下:

  1. 第一小节介绍正则表达式的来源,它的历史,它的优点和缺点。
  2. 第二小节介绍演示了URL和数字的正则表达式,并详细介绍示例中用到的语法
  3. 第三小节介绍创建正则表达式的两种方式,并且介绍RegExp对象的属性和方法
  4. 第四小节介绍正则表达式的语法。

1、简述正则

这一小节介绍正则,主要包含正则表达式的历史,JS正则表达式的由来,正则表达式的优点和缺点。

  1. JS的正则表达式是来源于Perl语言。
  2. 正则表达式起源于mathematical study of formal language。这部分内容省略,具体可以参考正则的百度百科或者是维基百科
  3. 正则表达式的缺点有
  • 语法非常复杂,编写正则表达式很困难
  • 出错之后发现错误很困难。
  • 维护很困难,如果需求发生变化,例如数字的正则要匹配为三个一组或四个一组的形式,在正则上修改会比较困难。
  • 很难写出精确的正则表达式,例如示例中正则,第一部分协议可以写成错误协议也可以通过正则,例如abc://www.baidu.com也可以通过。

  4.正则表达式的优点有:

  • 功能很强大
  • 应用也较为广泛,没有替代品,通常没有选择的余地。

2、简述正则

本小节演示了URL和数字的示例。并详细介绍其中用到的语法。

2.1 URL

/**
* 原书中的正则表达式,当看到这个时,我的感觉是完全在看火星文
* 继续读原书,继续看下去之后,这段火星文我感觉大部分理解了,有些地方甚至可以改进
*/
var urlReg =
/^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
// 测试的url地址
var url = "http://www.ora.com:80/goodparts?q#fragment";
/**
* 正则表达式的exec方法,
* 当正则有g标志时,数组的元素会返回匹配的子串。
* 当正则无g标志时,数组的第一个元素会返回第一个匹配的子串,剩余匹配的元素被忽略
* 若此时正则存在分组,则第二个元素为第一组,
*/
var result = urlReg.exec(url);
// 各个部分的内容
var names = ["url","schema","slash","host","port","path","query","hash"];
// 输出固定的格式
var blanks = ' ';
var i;
// 循环遍历
for(i=0;i<names.length;i++)
{
console.log(names[i] + ": "+ blanks.substring(names[i].length) + result[i]);
}
// 公共部分,它表示整个字符匹配,例如 abc 匹配字符串 abc不匹配 "abc bcd abc"中的abc
var commonPart1 = /^$/;
// ?:这个符号的意思是忽略在当前分组中忽略匹配的第一个字符,
// 少了这个符号,path部分会包含/,query部分会包含?,hash部分会包含#号
var commonPart2 = /(?:)/;
// 第一部分,?:表示忽略该分组,(([A-Za-z])+:)? ([A-Za-z])+任意的字母出现1次或多次,这里匹配协议http,:匹配:,
// (([A-Za-z])+:)? 协议出现0次或1次。这里可以改进,将一些常见的协议(http|https|ftp)
var part1 = /(?:([A-Za-z]+):)?/;
// 第二部分,匹配/出现0-3次,这里可以改进,直接写成两次2-3次, // 或 ///
var part2 =/(\/{0,3})/;
// 第三部分,匹配ip地址,域名,任意的字母,数字,-,dot号出现1次到多次,匹配www.ora.com
var part3 = /([0-9.\-A-Za-z]+)/;
// 第四部分,匹配端口号, 冒号+数字(至少1次),匹配:80
var part4 = /(?::(\d+))?/;
// 第五部分,匹配path部分的内容,[^?#]*,除?和#的其他字符出现0次或多次,匹配goodparts
var part5 = /(?:\/([^?#]*))?/;
// 第六部分,?号是特殊字符需要转义,[^#]*,除#的其他字符出现0次或多次,匹配q
var part6 = /(?:\?([^#]*))?/;
// 第七部分,(.*),任意的字符出现0到多次
var part7 = /(?:#(.*))?/;

2.2 数字

/**
* 数字的正则表达式
* 数字的组成部分包含: integer [.] [float] [e|E (+ | -)number]
* 整数部分,小数部分,科学计数法部分,小数部分和科学计数法部分都是可选的
*/
var numReg = /^-?\d+(?:\.\d*)?(?:e[+\-]?\d+)?$/i;
// 测试
console.log(numReg.test("1"));
console.log(numReg.test("98.6"));
// 正则有i标志,所以E也匹配
console.log(numReg.test("123.45E-67"));
// 违背了\d的规则
console.log(numReg.test("str"));
// 违背了\. ?的规则
console.log(numReg.test("132.21.86.100"));
// 违背了e的规则,
console.log(numReg.test("123.45D-67"));
// 整数部分,-最多出现1次,数字至少出现1次,这里可以改进,+1是不满足的
var part1 = /-?\d+/;
// 小数部分,小数点后面跟0到多个数字,这里可以改进,如果数字为0时会匹配.号,所以1.也匹配正则
var part2 = /(?:\.\d*)?/;
console.log(part2.test("1."));
// 科学计数法部分,字母e,+或者-出现0到1次,数字至少出现1次,
// 这里可以改进,科学计数法后面的数字只能是整数,其实可以为数字(没有理解,part3的测试也返回true)
var part3 = /(?:e[+\-]?\d+)?/;
console.log(part3.test("e3.14"));

3、正则对象

本小节介绍正则对象,包含三个部分,创建正则,查看正则的属性,使用正则的方法。

3.1 创建正则

创建正则表达式的方式有两种

  1. 字面量,/reg/flag的形式,reg表示符合语法规则的正则,flag表示正则的标志。
  2. 构造器,new RegExp(reg,flag),参数的含义与上述相同。

3.2 属性

正则的属性有五个

  1. source:正则的字符串形式
  2. global:正则是否有g标志,有该标志会全局匹配,默认情况下只匹配第一个
  3. ignoreCase:正则是否有i标志,有该标志会忽略大小写
  4. multiline:正则是否有m标志,有该标志表示字符串占多行
  5. lastIndex:正则表达式匹配的起始位置,初始值为0,第一次匹配之后,为匹配子串末尾的索引值加1。

3.3 方法

3.3.1   exec

表格2- 36 exec方法

名称

exec

描述

在字符串中查找满足正则的子串,调用方式为reg.exec(str),与str的match方法含义和功能基本相同,区别在于执行exec时,会设置RegExp对象的lastIndex属性,该值为子串最后一个字符的索引值

参数

参数:str

l  说明:字符串,

l  类型:string。

l  是否必填:是

链接

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec

3.3.2   test

表格2- 37 test方法

名称

test

描述

在字符串中查找满足正则的子串,若存在子串,返回true,不存在返回false,它与exec方法都会设置lastIndex的值

参数

参数:str

l  说明:字符串,

l  类型:string。

l  是否必填:是

链接

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test

4、正则语法

本小节的内容略。之后专门阅读正则相关的书籍。例如《Introducing Regular Expressions》,《Regular Expressions Cookbook, 2nd Edition》

前端——语言——Core JS——《The good part》读书笔记——第七章节(正则)的更多相关文章

  1. 前端——语言——Core JS——《The good part》读书笔记——初篇

    本书是一本经典,优秀的JS书籍. 目的 在书籍中作者多次提及本书的目的,让读者去发现语言中的精华部分,避免糟粕部分,提高代码的编写质量.简述为取其精华去其糟粕. 本书的内容只涉及到Core JS部分, ...

  2. 前端——语言——Core JS——《The good part》读书笔记——第九,十章节(Style,Good Features)

    第九章节 本章节不再介绍知识点,而是作者在提倡大家培养良好的编码习惯,使用Good parts of JS,避免Bad parts of JS.它是一篇文章. 本文的1-3段阐述应用在开发过程中总会遇 ...

  3. 前端——语言——Core JS——《The good part》读书笔记——第一章节(Good Parts)

    本章是引言,有四个小节,具体内容如下: 第一小节 第一小节介绍作者的观点,作者编写本书的目的. 原文:I discovered that I could be a better programmer ...

  4. 前端——语言——Core JS——《The good part》读书笔记——第四章节(Function)

    本章介绍Function对象,它是JS语言最复杂的内容. Java语言中没有Function对象,而是普通的方法,它的概念也比较简单,包含方法的重载,重写,方法签名,形参,实参等. JS语言中的Fun ...

  5. 前端——语言——Core JS——《The good part》读书笔记——第五章节(Inheritance)

    本章题目是继承,实质上介绍JS如何实现面向对象的三大特性,封装,继承,多态.本章的最后一个小节介绍事件. 与Java语言对比,虽然名称同样称为类,对象,但是显然它们的含义存在一些细微的差异,而且实现三 ...

  6. 前端——语言——Core JS——《The good part》读书笔记——第三章节(Object)

    本章介绍对象. 在学习Java时,对象理解为公共事物的抽象,实例为具体的个例,对象为抽象的概念,例如人为抽象的概念,具体的个例为张三,李四. Java对象种类多,包含普通类,JavaBean,注解,枚 ...

  7. 前端——语言——Core JS——《The good part》读书笔记——第六章节(Arrays)

    本章介绍数组的内容,Java中的数组在创建时,会分配同等大小的内存空间,一旦创建数组的大小无法改变,如果数据超过数组大小,会进行扩容操作.并且数组的元素类型在创建时必须是已知的,而且只能存放相同数据类 ...

  8. 前端——语言——Core JS——《The good part》读书笔记——第八章节(Methods)

    本章介绍JS核心对象的方法.这些对象包括Array,Function,Number,Object,RegExp,String.除这些常用的核心对象还有Date,JSON. 本章更偏向于API文档,介绍 ...

  9. 前端——语言——Core JS——《The good part》读书笔记——附录三,四,五(JSLint,铁路图,JSON)

    1.JSLint 本书的JSLint部分只是一个引言,详细了解该工具的使用参考http://www.jslint.com/ 2.铁路图 在本书中使用过的铁路图集中放在这部分附录中,其实读完本书之后,没 ...

随机推荐

  1. luogu P2158 [SDOI2008]仪仗队 (欧拉函数)

    欧拉函数裸题 可惜我太久没做题忘了欧拉函数是什么了... 注意判断一下n = 1的情况就好了 #include <cstdio> using namespace std; ; typede ...

  2. 在IIS中配置申请的SSL证书

    第一步,右键服务器证书=>打开功能 第二步,右侧选择导入,将申请到的证书按窗体内容导入即可 第三步,右键需要加载证书的网站,选择编辑绑定=>类型选择https=>选择刚才导入的数字证 ...

  3. 常用UrlEncode编码结果

    空格 ! # $ % + @ : = ? %20 %21 %23 %24 %25 %2B %40 %3A %3D %3F

  4. Js Jquery 时间控件显示小时 分钟 秒

    // ui.js 自带的datepicker 插件只能显示日期不能显示时分秒  使用dateTimePicker可以显示时间 效果图:     首先需要引用 js和css 注意 ui.js的顺序要在s ...

  5. spring security和java web token整合

    思路: spring security 1.用户输入用户名密码. 2.验证:从库中(可以是内存.数据库等)查询该用户的密码.角色,验证用户名和密码是否正确.如果正确,则将填充Authenticatio ...

  6. 浅析ReDoS

    ReDoS(Regular expression Denial of Service) 正则表达式拒绝服务攻击.开发人员使用了正则表达式来对用户输入的数据进行有效性校验, 当编写校验的正则表达式存在缺 ...

  7. optim.SDG 或者其他、实现随机梯度下降法

    optim.SDG 或者其他.实现随机梯度下降法 待办 实现随机梯度下降算法的参数优化方式 另外还有class torch.optim.ASGD(params, lr=0.01, lambd=0.00 ...

  8. C++-Typedef结构体遇上指针

    继Typedef遇上结构体数组后,我们又产生了新的疑问. 上一期地址:https://www.cnblogs.com/lemaden/p/10122929.html 昨天一位朋友又问我了,说结构体数组 ...

  9. java-Timestamp

    java获取取得Timestamp类型的当前系统时间格式:2010-11-04 16:19:42 方法1: Timestampd = new Timestamp(System.currentTimeM ...

  10. STL 萃取(Traits)机制剖析

    模板特化 在将萃取机制之前,先要说明模板特化 当有两个模板类,一个是通用泛型模板,一个是特殊类型模板,如果创建一个特殊类型的对象,会优先调用特殊的类型模板类,例如: template <type ...