正则表达式介绍

1、正则表达式是用于匹配字符串中字符组合的模式。正则表达式的模式规则是由一个字符序列组成的。包括所有字母和数字在内,大多数的字符都是直接按照直接量描述待匹配的字符。除此之外,正则表达式还有其他特殊语义的字符,这些字符不按照特殊含义进行匹配。
2、正则表达式是一个描述字符模式的对象。js中的正则表达式用RegExp对象表示,可以进行强大的模式匹配和文本的检索与替换功能。正则表达式的模式规则由一个字符串序列组成。

例如:

1、runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。

2、runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。

3、colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。

正则表达式作用

基于正则表达式我们可以

a,测试字符串内模式,比如测试电话号码是否符合规则可以成为数据验证,

b,替换文本,可以使用正则表达式识别文档中的特定文本,完全删除或者使用其他文本替换它。

c,基于模式匹配从字符串中提取字符串

正则表达式创建

JavaScript 中的正则表达式用 RegExp 对象表示,有两种创建方式。
1. 直接量语法创建
正则表达式直接量定义为包含在一对斜杠(/)之间的字符。

2. 构造函创建
可以通过 RegExp() 构造函数可以实现动态创建正则表达式。RegExp 的第二个参数是可选的。

new RegExp(pattern [, flags])
RegExp(pattern [, flags])
其中 pattern 可以是字符串或者正则字面量。当 pattern 是字符串时,需要常规的字符转义规则,必须将 \ 替换成 \\,比如 /\w+/ 等价于 new RegExp("\\w+")。

普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

非打印字符

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

特殊字符

所谓特殊字符,就是一些有特殊含义的字符,如上面说的 runoo*b 中的 *,简单的说就是表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在其前加一个 \: runo\*ob 匹配 runo*ob。

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。

正则表达式的限定符有:

由于章节编号在大的输入文档中会很可能超过九,所以您需要一种方式来处理两位或三位章节编号。限定符给您这种能力。下面的正则表达式匹配编号为任何位数的章节标题:

/Chapter [1-9][0-9]*/

请注意,限定符出现在范围表达式之后。因此,它应用于整个范围表达式,在本例中,只指定从 0 到 9 的数字(包括 0 和 9)。

这里不使用 + 限定符,因为在第二个位置或后面的位置不一定需要有一个数字。也不使用 ? 字符,因为使用 ? 会将章节编号限制到只有两位数。您需要至少匹配 Chapter 和空格字符后面的一个数字。

如果您知道章节编号被限制为只有 99 章,可以使用下面的表达式来至少指定一位但至多两位数字。

/Chapter [0-9]{1,2}/

上面的表达式的缺点是,大于 99 的章节编号仍只匹配开头两位数字。另一个缺点是 Chapter 0 也将匹配。只匹配两位数字的更好的表达式如下:

/Chapter [1-9][0-9]?/

直接量字符

正则表达式中所有字母和数字都是按照字面含义进行匹配的,其他非字母的字符需要通过反斜杠(\)作为前缀进行转移,如 \n 匹配换行符。这些字符为直接量字符(literal characters)。这些字符都是精确匹配,每一个字符都只能匹配一个字符。

在正则表达式中,有一些标点符号具有特殊含义,他们是:^ $ . * + ? = ! : | \ / ( ) [ ] { } 如果需要在正则表达式中与这些直接量进行匹配,必须使用前缀 \。

如果不记得哪些标点需要反斜杠转义,可以在每个标点符号前都加上反斜杠。

字符类

如果不想匹配某一个特定的字符而是想匹配某一类字符,则需要使用字符类。

通过将直接量字符放入方括号内,可以组成字符类(character class)。一个字符类可以匹配它所包含任意 一个 字符。如 [abc] 可以匹配 a,b,c 中任意一个字符。

使用 ^ 作为方括号中第一个字符来定义否定字符集,它匹配所有不包含在方框括号内的字符。[^] 可以匹配任意字符。

字符类可以使用连字符来表示字符范围。比如匹配小写字母[a-z],匹配任何字母和数字可以用[a-zA-Z0-9]。

一些常用的字符类,在 JavaScript 中有特殊的转义字符来表达它们。


方括号内也可出现转义字符,如 [\d\s] 表示匹配任意空白符或数字。

重复
当一个模式需要被多次匹配的时候,正则表达式提供了表示重复的正则语法。

贪婪和非贪婪的重复
上面所有的重复都是“贪婪的”匹配,也就是匹配尽可能多的字符。如 /a+/ 匹配 'aaaa' 时,它会匹配 'aaaa' 。

如果想要尽可能少的匹配,只需要在重复的标记后加一个问号(?)即可。如 /a+?/ 匹配 'aaaa' 时,它会匹配 'a' 。

注意:正则表达式的模式匹配总会寻找字符串中第一个可能匹配的位置,这意味这 /a+?b/ 匹配 'aaab' 时,匹配到的是 'aaab' 而不是 'ab'。

选择、分组和引用

选择
字符 | 用于分隔供选择的模式,匹配时会尝试从左到右匹配每一个分组,直到发现匹配项。如 /ab|bc|cd/ 可以匹配字符串'ab'、'bc' 和 'cd'。

分组
圆括号可以把单独的项组合成子表达式,以便可以像一个独立的单元用 |、*、+ 或者 ? 对单元内的项进行处理。

引用
带圆括号的表达式的另一个用途是允许在同一个正则表达式的后面引用前面的子表达式。通过\后面加数字实现。\n 表示第 n 个带圆括号的子表达式。表示引用前一个表达式所匹配的文本。因为子表达式可以嵌套,所以根据子表达式左括号的位置进行计数。

例,能匹配 1999-01-01 或 1999/01/01 的正则:/\d{4}([-//])\d{2}\1\d{2}/

具名引用
使用 (?<name>...) 的语法来为分组命名,并通过 \k<name> 在后面的正则表达式中引用。如上面的正则可以改写为:/\d{4}(?<separator>[-//])\d{2}\k<separator>\d{2}/

忽略引用
如果只想用圆括号来表示子表达式,而不希望生成引用,可以使用 (?:) 来进行分组。例,/(?:a)(?:b)(c)/ 中 \1 将表示 (c) 所匹配的文本。

指定匹配位置(锚元素)

有一些正则表达式的元素不用来匹配实际的字符,而是匹配指定的位置。我们称这些元素为正则表达式的锚。

正则表达式中的锚字符包括
1、用来匹配字符串的开始,多行检索时匹配一行的开头。
2、用来匹配字符串的结束,多行检索时匹配一行的结尾。
3、用来匹配单词的边界,就是 \w 和 \W 之间的位置,或者 \w 和字符串的开头或结尾之间的位置。
4、匹配非单词边界的位置。
例: /\bJava\b/ 可以匹配 Java 却不匹配 JavaScript。
注意:任意正则表达式都可以作为锚点条件。

先行断言
(?=pattern) 它表示一个位置,该位置之后的字符能匹配 pattern 。如 /\d+(?=%)/ 匹配字符串 '100%' 中的 '100' 但是不匹配 '100。'

负向先行断言
(?!pattern) 它表示一个位置,该位置之后的字符能不匹配 pattern 。

后行断言
(?<=pattern) 它表示一个位置,该位置之前的字符能匹配 pattern 。例,/(?<=\$)\d+/ 匹配 '$100' 但是不匹配 '¥100'。

负向后行断言
(?<!pattern) 它表示一个位置,该位置之前的字符能不匹配 pattern。

修饰符
在正则表达式的第二条斜线之后,可以指定一个或多个修饰符,/pattern/g。

常用修饰符

1、执行不区分大小写的匹配。
2、全局匹配。
3、多行匹配模式。
4、“粘连”(sticky)修饰符。y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
5、表示点(.)可以表示任意字符,不设置的话,四个字节的 UTF-16 字符和行终止符不能用 . 表示。
6、开启 “Unicode 模式”,用来正确处理大于 \uFFFF 的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
通过 RegExp.prototype.flags 可以获得正则修饰符的字符串。/pattern/ig.flags 返回 "gi"

字符串的正则方法

String.prototype.search(regexp|substr)
返回第一个和参数匹配的子串的起始位置。没有匹配子串返回 -1 。
如果参数不是正则表达式,将会通过 RegExp 构造函数转换成正则表达式。它会忽略正则的修饰符 g。

String.prototype.replace(regexp|substr, newSubStr|function)
第一个参数同search,查找指定子串。如果第二个表达式是字符串,将把第一个参数匹配的子串替换为 newSubStr。如果在替换字符串中出现了 $ 加数字,replace 将用与指定的子表达式相匹配的文本来替换这些字符。

例,单书名号包裹文本改为书名号。'<JavaScript>和<正则表达式>'.replace(/<([^_]*?)>/g, '《$1》') 会得到 "《JavaScript》和《正则表达式》"

使用字符串作为参数时替换字符串可以插入下面的特殊变量名:

1、$$ 插入一个 "$"
2、$& 插入匹配的子串。
3、`$`` 插入当前匹配的子串左边的内容。
4、$' 插入当前匹配的子串右边的内容。
5、$n 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始使用函数作为第二个参数。

function replacer(match, p1, p2, p3, offset, string) { }
// match        匹配的子串。
// p1,p2, ...   假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。
// offset       匹配到的子字符串在原字符串中的偏移量。子串首字母下标。
// string       被匹配的原字符串。
例,下划线命名转驼峰命名。'a_simple_name'.replace(/_([a-z])/g, (m, p1) => p1.toUpperCase()) 将得到 "aSimpleName"。

String.prototype.match(regexp)
参数 regexp 为一个正则表达式对象。如果传入一个非正则表达式对象,则会隐式地使用 new RegExp(obj) 将其转换为一个 RegExp 。

如果 regexp 没有设置修饰符 g,则仅返回第一个完整匹配及其相关的捕获组(Array),返回数组第一个字符是匹配字符串,余下的元素是正则表达式中圆括号括起来的子表达式。在这种情况下,返回的项目将具有如下所述的其他属性(groups: 一个捕获组数组 或 undefined(如果没有定义命名捕获组)。index: 匹配的结果的开始位置。input: 搜索的字符串。),或者未匹配时返回 null 。

如果使用 g 标志,则将返回与完整正则表达式匹配的所有结果,但不会返回捕获组,或者未匹配时返回 null 。

'196.168.0.1'.match(/(\d+)(?=.|$)/) // (?=.|$) 先行匹配 匹配 . 或者字符串结尾
// (2) ["196", "196", index: 0, input: "196.168.0.1", groups: undefined]
'196.168.0.1'.match(/(?<num>\d+)(?=.|$)/) // (?<name>) 具名引用 见上文
// (2) ["196", "196", index: 0, input: "196.168.0.1", groups: {num: "196"}]
'196.168.0.1'.match(/\d+(?=.|$)/g)
// (4) ["196", "168", "0", "1"]

String.prototype.split([separator[, limit]])
separator 指定表示每个拆分应发生的点的字符串,可以是一个字符串或正则表达式。如果空字符串("")被用作分隔符,则字符串会在每个字符之间分割。

limit 一个整数,限定返回的分割片段数量。

例,'张三;李四,王五|赵六'.split(/[;\|,]/) // (4) ["张三", "李四", "王五", "赵六"]

RegExp 的属性
flags 会返回正则表达式的修饰符。
表示对应修饰符是否存在的只读布尔值,global(表示是否带有修饰符 g),ignoreCase (i),multiline(m),sticky(y),dotAll(s),unicode(u)
source 只读字符串,包含正则表达式的文本。
lastIndex 可读/写整数。如果带有 g 修饰符,这个属性存储在整个字符串中下一次检索的开始位置。这个属性会被 exec() 和 test() 方法用到。

RegExp 的方法
exec()
如果没有找到任何属性,将返回 null,如果找到匹配返回一个数组,该数组第一个元素是相匹配的字符串,余下的元素是与圆括号内的子表达式相匹配的子串。

当调用 exec() 的正则表达式具有修饰符 g 时,它将把当前正则表达式对象的 lastIndex 属性设置为紧挨着匹配子串的字符位置。

注意即使两次匹配的不是同一个字符串,lastIndex 还是会连续生效的。

let reg = /\d+/g;
reg.exec('25*10=250'); // ["25", index: 0, input: "25*10=250", groups: undefined]
reg.lastIndex; // 2
reg.exec('666'); // ["6", index: 2, input: "666", groups: undefined]
reg.lastIndex; // 3

test()
调用 test() 和 exec() 等价,当 exec() 返回结果不是 null,test() 返回 true,否则返回 false 。

String 的方法不会用到 lastIndex 属性。

业余时间赚点零花钱点这里 https://mp.csdn.net/postedit/90601328

JavaScript正则表达式语法与示例相关推荐

  1. 【收藏】常用JavaScript正则表达式汇编与示例

    1 概述 1.1 前言 目前收集整理了21个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份证号.URL地址. IP地址. 十六进 ...

  2. javascript正则表达式(语法以及正则表达式修饰符)

    正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式. 搜索模式可用于文本搜索和文本 ...

  3. 基于正则表达式的JavaScript/C++语法高亮(js版)

    JavaScript的语法高亮一直是个难点,因为需要语义分析以确定/是除法操作的开始还是正则表达式的开始.目前关于高亮js的语法高亮都不是很理想,尤其是syntaxhighlighter(你待会看到的 ...

  4. Java正则表达式的语法与示例

    Java正则表达式的语法与示例 正则表达式是什么?用我的理解就是一个表达式.用来匹配,替换,判断字符串,之前业务就出现过判断返回值是否为邮箱. 以下内容来自于http://baike.xsoftlab ...

  5. 【专题】常用JavaScript正则表达式(regexp)汇编与示例

    1 概述 1.1 前言 目前收集整理了21个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份证号.URL地址. IP地址. 十六进 ...

  6. 【JavaScript基础语法】正则表达式——限制input输入框只能输入字母、数字、字符等

    通过JavaScript正则表达式限制input输入框的输入内容 场景复现 干货分享 场景复现 最近在项目中碰上了限制input输入框的输入内容的需求,于是查阅了资料,总结以下这些非常实用的JavaS ...

  7. javascript 正则表达式详解

    正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个 ...

  8. (转)JAVA正则表达式语法大全

    [正则表达式]文本框输入内容控制 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$". 只能输入n位的数字:"^\d{n ...

  9. JavaScript正则表达式快速简单的指南

    Interested in learning JavaScript? Get my ebook at jshandbook.com 有兴趣学习JavaScript吗? 在jshandbook.com上 ...

最新文章

  1. java-在应用中获取spring定义的bean
  2. 雷林鹏分享:Ruby XML, XSLT 和 XPath 教程
  3. 一起谈.NET技术,C# 中奇妙的函数之ToLookup
  4. 链表 java详解_链表详解——Java版
  5. 【赛尔笔记】文本摘要论文列表
  6. 西门子、三菱、台达PLC手机组态软件,支持modbus协议的ModbusTesla手机组态软件 只支持modbus tcp,只要下位机支持标准的modbus协议就可以
  7. 【九天教您南方cass 9.1】 09 提取坐标的几种方法
  8. 微信公众开发 表情开发php,微信开发Emoji表情的实例教程
  9. linux运行Windows模拟器,Wine(Windows模拟器)
  10. Service Temporarily Unavailable
  11. md5验证文件完整性
  12. java excel添加公式_Java 添加、读取 Excel 公式
  13. ubuntu看不了bilibili视频
  14. nx.adjacency_matrix(G).todense()计算邻接矩阵与真实结果不一致
  15. 用声卡实现的存储示波器
  16. 如何提高场馆的二次成交率?
  17. 解决图片按顺序加载问题
  18. 5个人审查5开源视频聊天工具
  19. R语言学习系列教程及高级绘图工具使用
  20. 前端 js 上传excel表格、文件

热门文章

  1. NOIP2018没有什么新闻
  2. Spring自定义注解简单使用四步走
  3. 智能安防新时代:用户、SI、设备制造商要做什么?
  4. UBoot常用命令手册
  5. eclipse工程 'cocostudio/CocoStudio.h' file not found
  6. Windows、Linux系统安装JDK配置Java环境变量
  7. 打开MSN提示Windows Live Communication Platform遇到问题需要关闭错误的解决方法
  8. Struts1之Action小结
  9. oracle java 绑定变量的值_Oracle SQL调优之绑定变量用法简介
  10. python json转换字典_Python json转字典字符方法实例解析