概念先行。

正则表达式:又称规则表达式。常用于检索,替换符合某种符合(规则)的文本。

组成普通字符和元字符,普通字符就是一个普通的查找串,如abc,原字符具有特殊含义。

这里研究的是JavaScript的正则,还有一个修饰符的概念。

最简单的正则表达式就像一个查找字符串。

语法:  /正则表达式主体/修饰符(可选)

如:

1 const str = 'testings'
2
3 cosnt patt = '/testing'
4
5 // test是正则表达式方法,用于检测一个字符串中是否匹配某个模式(正则),有则true,否则false
6 patt.test(str) // ture

这里先不深究方法

元字符:

之前觉得其似懂非懂在于元字符的多其杂,又没有下功夫就深究(这是重点)。

--  开始

\  :  将下一个字符标记符、或向后引用、或一个八进制转义符。常见于,\\ 匹配 \ , \\n 匹配  \n ,和一些字符搭配会产生一些预定义模式,如 \d 表示查找数字,等同于[0-9], 活用转义能够达成很多复杂的情况。

-- 定位符

^ : 1、限定开头,如 /^a 匹配a开头的的字符串,如匹配abc,而不会匹配bca。 2、 取反,  当这个字符出现在一个字符集合模式中,意义则不同了,如 [^0-9],匹配除了0到10以外的所有字符。

$ : 匹配输入的行尾, 即限定行尾。如: /a$ 匹配 bca中的a,而不匹配abc中的a

两个预定义的模式

\b: 匹配一个单词边界,如字与空格直接的位置。如/ble\b,匹配in posible xxx中的ble。不匹配ablexxxx中ble。因为不是在单词边界。与$不同是$是行尾。

\B: 匹配非单词边界。与上面相方。

注意:定位符和限定符不能连在一起使用。如^+,会报错.

-- 限定符

* :匹配前面子表达式(注意是表达式)的任意次。等价于 {0,}。 如:ab* 可以匹配a,也可以匹配ab, abb。/a(bc)*,那就是a可以,abc可以,abcbc可以

+:匹配前面子表达式一次或者更多,(大于等于1)等价于{1, }。/ab+ 可以匹配ab,abb,无法匹配a

?:匹配前面子表达式零次或者一次, 等价于{0,1}。如: /ab? 匹配ab中a,ab。ac中a也是匹配的

限定符中的+和*都是贪婪匹配的,即能匹配多点就匹配多点。如/a+,能匹配baad中的aa,也不只匹配a。所以有 ?(不是上面那个的意思),加在限定符的后面。表示不贪婪匹配。

如果是这样:  /a+?,那么baaaad中,只匹配a,即结果为a, 而不匹配更多。

 1 // 举个有趣的栗子
2 <p>hello,world</p>
3
4 // 正则 /<.*>
5 // 会直接匹配整条式子。
6 <p>hello,world</p>
7
8 // 如果加上?, 即/<.*?>
9 // 匹配结果为
10 <p>

-- 三种括号

--- 大括号 {}

{ : 标记限定符表达式的开始,和 } 搭配。如:{n},{n,}, {n,m}

{n} : n是一个非负整数,匹配确定的n的次数。如:a{3},匹配aaa,也匹配baaad中的aaa,限定死次数。

{n, }: n是一个非负整数,匹配至少n次,后一个参数为空,表示无限。如:a{1,} 匹配a, 也可以匹配aa,aaa, baaaa, baaaad这里。

{n, m}:m和n都是一个非负整数,圈定一个范围。最少匹配n次,最后匹配m次。如:{1,3}就是最少匹配一次,最多匹配3次。

--- 小括号 ()

():表达一个子表达式的开始和结束位置,专业名词为(组)。如:/a(ab)+,匹配a, aab。甚至可以混合一起来,/(ab){1,2}, 匹配ab,abab。甚至更多更多的混合,以达到目的。

--- 中括号[]

[]:表示字符集合,这点和小括号常容易弄混,如[abc],可以匹配a,可以匹配b一样。piano也能匹配其中的a。同时还可以使用-作为连接符号,如[0-9]表示匹配0到9的数字,

-- 其他

. : 匹配除了换行\n和\r之外的任意字符。如果想匹配换行,可以使用[\s\S]这种模式。

| :或,匹配或者是那个 /z|foo,匹配z或者foo。混搭如:/[z|f]oo,匹配zoo或者foo。

注:由于上诉都是特殊字符,有其特殊的含义,所有需要匹配上面的字符的时候,都需要增加转义,如: /\+,来匹配+这个字符。

-- 非打印字符(比较僻)

非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列

\cx:匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。(真的很少用)

\f: 匹配一个换页符。等价于 \x0c 和 \cL。

\n: 匹配一个换行符

\r:匹配一个回车符

\s:匹配所有空白字符。包括空格,换页符,制表符

\S:匹配任何非空白字符。

\t:匹配一个制表符。

\v: 匹配一个垂直制表符。等价于 \x0b 和 \cK。

-- 常用预定义模式

经常用\字母来使用预定义模式,而该模式的大写往往是小写含义的相反。下面四个是常用的。

\d: 匹配一个数字字符,等价于[0-9]

\D: 匹配一个非数字字符,等价于[^0-9]

\w: 匹配字母,数字,下划线。等价于[A-Za-z0-9_]。

\W:匹配非字母,数字,下划线。等价于[^A-Za-z0-9_]。

运算符优先级:(上到下,高到低)

\: 转义  (1)

(),[]:圆括号和方括号 (2)

*,+,?{n}: 限定符 (3)

^,\任意元字符,$,任意字符 (4)

| : 或  (5)

修饰符:

javasript中正则表达式有个修饰符的概念。

ES6前有3个,分别是i, g, m

i: 执行对大小写不敏感

g:执行全局匹配(而非找到第一个字符串后就停下)

m: 执行多行匹配

ES6后增加了几个修饰符 u, y, s

u: ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。这里有个概念,ES5前是不支持大于\uFFFF的 Unicode 字符。JavaScript会将其认为是两个字符,这会导致一些问题。增加u,就能正确处理了

y: 这个也是ES6的新概念,名称为粘连。和g一样都是全局匹配,不同是g是剩余位置只有有匹配就可以继续匹配。但是y限制必须从上一个结尾的位置有匹配才继续匹配。

如:

 1 const s = 'aaa_aa_a'
2
3 const pattone = /a+/g
4 const patttwo = /a+/y
5
6 pattone.exec(s) // aaa
7 patttwo.exex(s) // aa
8
9
10 pattone.exec(s) // aa
11 patttwo.exex(s) // null

s: dotALL模式,匹配任意单个字符。应对于正则中的点.元字符,无法匹配换行的情况,上面我们可以用其他方法解决,ES6提出一种方法。就是添加s修饰符。

如:

1 const patt = /hello.word
2
3 patt.test(‘hello\nword’) // 中间有\n换行,匹配false
4
5 使用s修饰符
6
7 /hello.word/s.test(‘hello\nword’) // 成功

文章很长,谢谢阅读。

讲点题外话,说起正则表达式,对其是又爱又恨,之前收录过一篇常用正则表达式,实际上也只是收录常用的语法,但实际上重头写一个复杂的正则表达式却写不出,所以决定来从头碰一碰他,发现其实很有魅力。

代码这种东西真是一碰就停不下来。

最后一句,热爱可挡岁月漫长,与君共勉。

JavaScript正则表达式随笔的更多相关文章

  1. JavaScript正则表达式,你真的知道?

    一.前言 粗浅的编写正则表达式,是造成性能瓶颈的主要原因.如下: var reg1 = /(A+A+)+B/; var reg2 = /AA+B/; 上述两个正则表达式,匹配效果是一样的,但是,效率就 ...

  2. 【JS】javascript 正则表达式 大全 总结

    javascript 正则表达式 大全 总结 参考整理了一些javascript正则表达式 目的一:自我复习归纳总结 目的二:共享方便大家搜索 微信:wixf150 验证数字:^[0-9]*$ 验证n ...

  3. 理清JavaScript正则表达式--上篇

    在JavaScript中,正则表达式由RegExp对象表示.RegExp对象呢,又可以通过直接量和构造函数RegExp两种方式创建,分别如下: //直接量 var re = /pattern/[g | ...

  4. 理清JavaScript正则表达式--下篇

    紧接:"理清JavaScript正则表达式--上篇". 正则在String类中的应用 类String支持四种利用正则表达式的方法.分别是search.replace.match和s ...

  5. JavaScript正则表达式详解(一)正则表达式入门

    JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...

  6. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  7. Python自动化 【第十八篇】:JavaScript 正则表达式及Django初识

    本节内容 JavaScript 正则表达式 Django初识 正则表达式 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...

  8. JavaScript正则表达式下——相关方法

    上篇博客JavaScript 正则表达式上——基本语法介绍了JavaScript正则表达式的语法,有了这些基本知识,可以看看正则表达式在JavaScript的应用了,在一切开始之前,看看RegExp实 ...

  9. JavaScript 正则表达式上——基本语法

    定义 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...

随机推荐

  1. 第一篇 Hell wcf

    老老实实学WCF  第一篇 Hello WCF WCF(Windows Communication Foundation)是微软公司推出的面向服务技术的集大成者,涵盖继承了其之前发布的所有的分布式应用 ...

  2. pwnable.kr-cmd1-witeup

    执行分析程序,知过滤掉了flag.sh.tmp字段,但在linux下可通过通配符匹配文件哦. 哦对,参数输入的命令中,没有环境变量的支持,所有文件和命令必须用绝对路径哦.

  3. vs code的使用与常用插件和技巧大全总结

    vs code的使用与常用插件和技巧大全总结 Author:3# 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@ 极客小俊,CSDN官方首发 ...

  4. Processing 网格(棋盘格)无限偏移纹理动画

    过火 再度出击!这次我们要玩得更火一点---把静帧变动画.没错,将棋盘格动起来!看一下效果: 这是一个经典的无限偏移动画,在很多2d横版射击游戏中都会采用的技术.如何在Processing中实现,有两 ...

  5. linux 漏洞列表

    #CVE #Description #Kernels CVE-2017-1000367 [Sudo](Sudo 1.8.6p7 - 1.8.20) CVE-2017-7494 [Samba Remot ...

  6. matlab中num2str 将数字转换为字符数组

    参考:https://ww2.mathworks.cn/help/matlab/ref/num2str.html?searchHighlight=num2str&s_tid=doc_srcht ...

  7. VS Code 搭建编写Shell环境(WSL)

    安装过程 Win10开启WSL,方法略 安装VSCode,方法略 安装语法提示插件:shellman 安装格式化插件:shell-format(右键 -> 格式化文档(Ctrl + Alt + ...

  8. CRUD,分页,排序,搜索与AngularJS在MVC

    下载source - 53.1 MB 介绍 在选择最新的技术时,有几个因素会起作用,包括这些技术将如何与我们的项目集成.这篇文章解决了开始使用AngularJS和MVC的乞丐的问题.这篇文章告诉使用语 ...

  9. 史上最全Python快速入门教程,满满都是干货

    Python是面向对象,高级语言,解释,动态和多用途编程语言.Python易于学习,而且功能强大,功能多样的脚本语言使其对应用程序开发具有吸引力.Python的语法和动态类型具有其解释性质,使其成为许 ...

  10. java 图片相似度算法

     利用直方图原理实现图像内容相似度比较  ,作为笔记记录在随笔中.   public class PhotoDigest {     public static void main(String[]  ...