1. JS中正则表达式定义

JavaScript 中的正则表达式用 RegExp 对象表示。

JS中定义正则表达式的两种方法:

方法 示例
RegExp 对象 var pattern = new RegExp("s");
直接量 var pattern = /s/;

2. 直接量字符

正则表达式中的所有字母和数字都是按照字面含义进行匹配的,同样也支持非字母数字的字符匹配,这些字符需要通过反斜线 '\' 作为前缀进行转义。

除了字母和数字之外的字符都需要通过反斜线\ 来转义。

正则表达式中的直接量字符:

直接量字符 匹配
字母和数字字符 自身
\o NUL字符(\u0000)
\t 制表符(\u0009)
\n 换行符(\u000A)
\v 垂直制表符(\u000B)
\f 换页符(\u000C)
\r 回车符(\u000D)
\xnn 由16进制数nn指定的拉丁字符,例如,\x0A等价于\n
\uxxxx 由16进制数xxxx指定的Unicode字符,例如\u0009等价于\t

3. 字符类

将直接量字符单独放在方括号内就组成了字符类。

正则表达式中的字符类:

字符类 匹配
[...] 方括号内的任意字符
[^...] 不在方括号内的任意字符
. 除换行符和其它Unicode行终止符之外的任意字符
\w 任何ASCII字符组成的单词,等价于 [a_zA-Z0-9]
\W 任何不是ASCII字符组成的单词,等价于 [^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符
\d 任何ASCII数字,等价于 [0-9]
\D 除了ASCII数字之外的任何字符,等价于 [^0-9]

4. 重复字符

正则表达式中的重复字符:

重复字符 含义
{n,m} 匹配前一项至少n次,但不超过m次
{n,} 匹配前一项n次或更多次
{n} 匹配前一项n次
匹配前一项0次或1次,等价于 {0,1}
+ 匹配前一项1次或多次,等价于 {1,}
* 匹配前一项0次或多次,等价于 {0,}

默认为贪婪匹配,若要实现非贪婪匹配,只需在待匹配的项后面加1个 ? 即可。

详细说明见贪婪匹配和非贪婪匹配

5. 选择,分组和引用

正则表达式中的选择、分组和引用字符:

字符 含义
| 选择,匹配的是该符号左边或右边的子表达式
(...) 组合,将几个项组合成一个单元,可以记住和这个组合相匹配的字符串var result = 'JavaScript'.match(/(Java)Script/) result[0] = 'JavaScript' result[1] = 'Java' result[1] 中的内容就是(Java)组合中匹配到的字符串
(?:...) 把几个项组合成一个单元,但是不记住和这个组合相匹配的字符串
(\n) 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也可能是嵌套的),组索引是从左到右的做括号数。 /(['"])[^'"]*\1/这样当 (['"]) 中匹配的是单引号时,\1 就是单引号,当 (['"]) 中匹配的是双引号时,\1 就是双引号,这样保证了前后的一致性。
(?<name>)(提案) 具名组 格式:“问号+尖括号+组名” 作用:为每一个组匹配指定一个名字 ,可以通过exec方法返回结果的groups属性上引用该组名 示例1let result = /(?<year>\d{4})-(?<month>\d{2})/.exec('2019-10'); // result=['2019-10','2019',10] result.groups={year:'2019', month:'10'} 注意:如果要在正则表达式内部引用某个“具名组匹配”,可以使用 \k<组名> 的写法,同时数组引用也依然有效 示例2let result = /^(?<word>[a-z]+)!\k(word)!\1$/.test('abc!abc!abc') // true let result = /^(?<word>[a-z]+)!\k(word)!\1$/.test('abc!abc!ab') // false

6. 指定匹配位置

正则表达式中的锚字符:

字符 含义
^ 匹配字符串的开头,在多行匹配(有修饰符m)中匹配每一行的开头
$ 匹配字符串的结尾,在多行匹配(有修饰符m)中匹配每一行的结尾
\b 匹配一个单词的边界,简言之,就是位于字符 \w\W 之间的位置,或位于字符 \w 和字符串的开头或者结尾之间的位置(但需要注意, [\b]匹配的是退格符)
\B 匹配非单词边界的位置
(?=p) 零度正向先行断言,要求接下来的字符要与p匹配,并且匹配的结果不包含p,如 var result = 'JavaScript:a'.match(\JavaScript(?=:)\) 匹配结果: result[0]='JavaScript' JavaScript 后面要紧跟着是 ':' 才能匹配成功,并且结果中不包含 ':'
(?!p) 零度负向先行断言,要求接下来的字符不与p匹配
(?<=p)(提案) 后行断言,要求前面的字符要与p匹配,并且匹配的结果中不包含p,如 var result = /(?<=\$)\d+/.exec('$100*80'); // result=['100']
(?<!p) 后行否定断言,要求前面的字符不能与p匹配,并且匹配结果中不包含p,如 var result= /(?!\$)\d+/.exec('$100*80'); // result=['80']

7. 修饰符

正则表达式中的修饰符:

字符 含义
i 忽略大小写
g 全局匹配,也就是找到所有的匹配,而不是找到第一个匹配之后就停止
m 多行匹配,^匹配每一行的开头,$匹配每一行的结尾
u(ES6) 能够处理码点大于 \uFFFF 的Unicode字符,即能够处理4个字节的UTF-16编码
y(ES6) “粘连”修饰符,匹配必须从未匹配字符串的第一个位置开始,即暗含头部匹配。下一次的匹配是在lastIndex的位置开始匹配。详细说明见[ES6y修饰符]( <https://blog.csdn.net/qq_43199318/article/details/102489816 )。
s(提案) 使 '.' 修饰符可以匹配任意一个字符

8. String 方法

String支持的4中使用正则表达式的方法:

String方法 用法
search() 参数:一个正则表达式 ,若不是,会先通过RegExp构造函数将其转换成正则表达式 返回值:第一个与之匹配的子串的起始位置,若匹配失败返回-1 注意:不支持全局搜索,忽略g修饰符 示例'JavaScript'.search(/Script/); // 4
replace() 参数:第一个是正则表达式,第二个是要进行替换的字符串 返回值:替换后的字符串 注意:如果第一个参数不是正则表达式,不会进行转换 示例'javascript'.replace(/\w+/,'JavaScript'); // JavaScript
match() 参数:一个正则表达式,若不是,会先通过RegExp构造函数将其转换成正则表达式 返回值:非全局匹配时:一个数组,第一个元素是与正则表达式相匹配的字符串,余下的元素是与圆括号(分组)内的子表达式匹配的字符串 全局匹配时:一个数组,元素由正则表达式相匹配的字符串组成,也就是只有非全局匹配时返回数组的第一个元素 注意:非全局匹配时,返回的数组带有两个属性,input:要匹配的字符串 index:匹配成功的子串的起始位置 示例var result = '1+2=3'.match(/\d+/); //result[0]='1' result.index=0 result.input='1+2=3' var result = '123'.match(/(1)/d+/); // result[0]='123' result[1]='1'result.index=0 result.input='123' 全局匹配时var result = '123'.match(/(1)/d+/g); // result[0]='123' 没有index,input等属性,也没有result[1]
split() 参数:可以是一个字符串也可以是一个正则表达式 返回值:将一个字符串拆分为一个子串组成的数组 示例'1, 2, 3'.split(','); // ['1', '2', '3'] '1, 2, 3'.split(/\s*,\s*/); //['1','2','3']

9. RegExp对象

RegExp的属性:

属性 含义
source 只读字符串,包含正则表达式文本
global 只读布尔值,说明是否带有全局匹配修饰符g
ignoreCase 只读布尔值,说明是否带有忽略大小写修饰符i
multiline 只读布尔值,说明是否带有多行匹配修饰符m
lastIndex 可读写的整数,存储下一下匹配时的起始位置
sticky(ES6) 只读布尔值,表示是否设置了y修饰符
flags(ES6) 返回正则表达式的修饰符 /abc/ig.flags // 'gi'

RegExp的方法:

方法 用法
exec() 参数:一个字符串 返回值:无论是否是全局匹配,都返回一个数组,并且第一个元素是与正则表达式相匹配的字符串,余下的元素是与圆括号内的子表达式相匹配的字串 注意:无论是否是全局匹配返回的数组都带有index和input属性 示例var result = /(1)\d+/.exec('123'); // result[0]='123 result[1]='1' result.index=0 result.input='123' var result = /(1)\d+/g.exec('123); //result[0]='123' result[1]='1' result.index=0 result.input-'123' 全局匹配
test() 参数: 一个字符串 返回值:如果包含正则表达式的一个匹配结果,返回true,否则返回null 示例/\d+/.test('123'); // true /\d+/.test('abc'); // null

正则表达式(JS表格简要总结)的更多相关文章

  1. js插件---JS表格组件BootstrapTable行内编辑解决方案x-editable

    js插件---JS表格组件BootstrapTable行内编辑解决方案x-editable 一.总结 一句话总结:bootstrap能够做为最火的框架,绝对不仅仅只有我看到的位置,它应该还有很多位置可 ...

  2. 学习 正则表达式 js java c# python 通用

    正则表达式 js java c# python 学习网站 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Globa ...

  3. js 表格操作----添加删除

    js 表格操作----添加删除 书名:<input type="text" id="name"> 价格:<input type="t ...

  4. 正则表达式 js 怎么获取匹配的变量

    正则表达式 js 怎么获取匹配的变量 $0 ~ $9 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  5. JS正则表达式语法(含ES6)(表格简要总结)

    文章目录 JS正则表达式 1. JS中正则表达式定义 2. 直接量字符 3. 字符类 4. 重复字符 5. 选择,分组和引用 6. 指定匹配位置 7. 修饰符 8. String 方法 9. RegE ...

  6. slickgrid 一个优秀的JS表格插件

    从熟悉JS以来,慢慢的喜欢上了这个门语言. 不自觉的,看了好多js的知识,可能也是因为做项目的原因吧. 这里稍微说下一个JS的grid插件 --slickgrid 了解这个插件也不是很多,稍微了解了下 ...

  7. JS表格分页(封装版)

    HTML代码: <html> <head> <meta charset='utf-8'> <script type="text/javascript ...

  8. 三.jquery.datatables.js表格编辑与删除

    1.为了使用如图效果(即将按钮放入行内http://www.datatables.net/examples/ajax/null_data_source.html) 采用了另一个数据格式 2.后台php ...

  9. JS表格分页组件:fupage的设计思路和详细使用方法(未来考虑开源,争取在2015年)

    一.背景         之前在秒针工作的时候,某js高级project师写了非常多自己的组件.当中一套是分页组件.叫做st-grid. 只是在我看来,bug太多.我常常给他反馈bug,我也不清楚为啥 ...

随机推荐

  1. Ubuntu的BEEP去哪里了?

    一直知道ubuntu的beep不响应了,但是一直都没太关注过它怎么了. 今天关注了一下,发现网上都是在问怎么关掉它的,时间还是在07年左右. 搜索到了一些帖子,有一些是说没有找到恢复的方法,还有一些, ...

  2. 从零开始学习R语言(三)——数据结构之“矩阵(Matrix)”

    本文首发于知乎专栏:https://zhuanlan.zhihu.com/p/60140022 也同步更新于我的个人博客:https://www.nickwu.cn/blog/id=129 3. [二 ...

  3. 安卓侧滑菜单及MenuPopup 的功能实现

  4. JDBC怎么连接数据库

    1:注册驱动:class.forName("com.mysql.jdbc.Driver"); 2:连接数据库:DriverManager.getConnection(url , u ...

  5. hdu1035 机器人走格子,格子指明方向,问几步走出格子或者是否有形成圈

    只要根据格子的方向选择下一步搜索的方向即可,退出条件是出界或者进入环中,进入环中的条件也很好确定,就是一个点走了两次,由于路径是固定的,这就会陷入无限循环. #include<iostream& ...

  6. 项目脚手架 - 《Spring Boot + MyBatis + MyBatis Generator》

    前言 最近启动了一个新的项目发现,每当一个新项目的启动往往需要从头搭建一个"框架",其中虽然很多基础代码可以Copy,但也会浪费不少时间. 基于这个情况,我打算在GitHub上创建 ...

  7. 谷歌出品EfficientNet:比现有卷积网络小84倍,比GPipe快6.1倍

    [导读]谷歌AI研究部门华人科学家再发论文<EfficientNet:重新思考CNN模型缩放>,模型缩放的传统做法是任意增加CNN的深度和宽度,或使用更大的输入图像分辨率进行训练,而使用E ...

  8. linux 中的页缓存和文件 IO

    本文所述是针对 linux 引入了虚拟内存管理机制以后所涉及的知识点.linux 中页缓存的本质就是对于磁盘中的部分数据在内存中保留一定的副本,使得应用程序能够快速的读取到磁盘中相应的数据,并实现不同 ...

  9. 6.Metasploit生成apk攻击Android实例

    Metasploit进阶第四讲 生成Android  apk文件 01  msfvenom基本参数 msfvenom介绍 承接上回,staged/unstage payload如何利用? msfven ...

  10. C/C++知识总结 四 循环与分支语句

    C/C++循环与分支语句 循环与分支语句的意义 关系运算符.逻辑运算符 for循环和嵌套for循环(基于范围for循环) while循环与do while循环 分支if语句.if else语句.if ...