JavaScript中,正则表达式所涉及的api,解析、实例和总结

news2024/9/22 1:23:11

JS中正则的api包括以下:

  • String#search
  • String#split
  • String#match
  • String#replace
  • RegExp#test
  • RegExp#exec

1. String#search

查找输入串中第一个匹配正则的index,如果没有匹配的则返回-1。g修饰符对结果无影响

var string = "abbbcbc";
var regex = /bc/g;
console.log(string.search(regex));
console.log(!!~string.search(regex));

//log
3
true
var regex = /bcd/g;
console.log(string.search(regex));
console.log(!!~string.search(regex));

//log
-1
false

扩展:使用 !!~ 的话,如果为 -1 则会得到 false;除此以外得到的都是 true

2. String#split

匹配上正则后,可以使用正则对输入串进行切分,得到一个字符串数组;如果没有匹配成功,则返回一个由原输入串组成的一个元素的字符串数组。g修饰符对结果无影响

var regex = /\D/;
console.log("2017/06/26".split(regex));
console.log("2017.06.26".split(regex));

//log
[ '2017', '06', '26' ]
[ '2017', '06', '26' ]
var regex = /,/;
console.log("2017/06/26".split(regex));

//log
[ '2017/06/26' ]

它可以有第二个参数,表示结果数组的最大长度,可以避免被错误分割

3. String#match

查找输入串中,匹配正则的部分。

其受g修饰符的影响,不带g的话,只会查找第一个匹配正则的子串,但得到的信息较多:第1个参数为匹配到的子串;第2个参数开始是匹配到的分组内容,如果有多个分组,就会有多个结果,可以没有;倒数第3个参数是匹配到的位置index;倒数第2个参数是输入串的内容;最后一个未知

var regex = /a(b{2,5})c/;
var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log(string.match(regex));

//log
[
  'abbc',
  'bb',
  index: 4,
  input: 'abc abbc abbbc abbbbc abbbbbc abbbbbbc',
  groups: undefined
]

带g的话,表示全局匹配,得到的是输入串中所有匹配的子串

var regex = /a(b{2,5})c/g;
var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log(string.match(regex));

//log
[ 'abbc', 'abbbc', 'abbbbc', 'abbbbbc' ]

当没有匹配时,不管有无 g,都返回 null

4. String#replace

replace可以将输入串中匹配到正则的子串,用替换物去替换掉。

可以分为两种用法:替换物为字符串、替换物从函数回调中得到:

4.1 替换物为字符串

其受g修饰符的影响,不带g的话,只会替换第一个匹配到的子串

var regex = /^|$/;
var replacement = '#';
var string = "hello";
var result = string.replace(regex, replacement);
console.log(result);

//log
#hello

带g的话,会替换所有匹配到的子串

var regex = /^|$/g;
var replacement = '#';
var string = "hello";
var result = string.replace(regex, replacement);
console.log(result);

//log
#hello#

替换物为字符串时,如下的字符有特殊的含义:
在这里插入图片描述

4.2 替换物从函数回调中得到

  • 每当输入匹配到一次正则时,就会回调一次函数。函数的返回值替换掉子串的内容,如果函数没有返回值则不替换。
  • 函数回调的参数:第1个为匹配整体内容,倒数第2个为index,倒数第1个为输入串,中间的按顺序依次为第1个分组、第2个分组、第3个分组的内容。

其也受g修饰符的影响,不带g的话,只会在第一次匹配到子串时回调函数

var regex = /(\d{4})-(\d{2})-(\d{2})/;
var string = "2017-06-12时间2024-03-18";
var result = string.replace(regex, function (match, year, month, day, index, input) {
  console.log(`match: ${match}, year: ${year}, month: ${month}, day: ${day}, index: ${index}, input: ${input}`);
  return month + "/" + day + "/" + year;
});
console.log(result);

//log
match: 2017-06-12, year: 2017, month: 06, day: 12, index: 0, input: 2017-06-12时间2024-03-18
06/12/2017时间2024-03-18

带g的话,进行全局匹配,会在每一次匹配到子串时回调函数

var regex = /(\d{4})-(\d{2})-(\d{2})/g;
var string = "2017-06-12时间2024-03-18";
var result = string.replace(regex, function (match, year, month, day, index, input) {
  console.log(`match: ${match}, year: ${year}, month: ${month}, day: ${day}, index: ${index}, input: ${input}`);
  return month + "/" + day + "/" + year;
});
console.log(result);

//log
match: 2017-06-12, year: 2017, month: 06, day: 12, index: 0, input: 2017-06-12时间2024-03-18
match: 2024-03-18, year: 2024, month: 03, day: 18, index: 12, input: 2017-06-12时间2024-03-18
06/12/2017时间03/18/2024

5. RegExp#test

判断输入串中,是否包含匹配正则的子串

其受g修饰符的影响,不带g的话,匹配的起始位置都是0

var regex = /\d+/;
console.log(regex.lastIndex, regex.test("123abc34def"));
console.log(regex.lastIndex, regex.test("123abc34def"));
console.log(regex.lastIndex, regex.test("123abc34def"));
console.log(regex.lastIndex, regex.test("123abc34def"));

//log
0 true
0 true
0 true
0 true

带g的话,进行全局匹配,匹配的起始位置是从正则对象的 lastIndex 属性开始(第一次lastIndex为0)

var regex = /\d+/g;
console.log(regex.lastIndex, regex.test("123abc34def"));
console.log(regex.lastIndex, regex.test("123abc34def"));
console.log(regex.lastIndex, regex.test("123abc34def"));
console.log(regex.lastIndex, regex.test("123abc34def"));

//log
0 true
3 true
8 false
0 true

6. RegExp#exec

查找输入串中,匹配正则的部分。包括以下信息:第1个参数为匹配到的子串;第2个参数开始是匹配到的分组内容,如果有多个分组,就会有多个结果,可以没有;倒数第3个参数是匹配到的位置index;倒数第2个参数是输入串的内容;最后一个未知

其受g修饰符的影响,不带g的话,匹配的起始位置都是0

var regex = /(\d)([a-z])/;
console.log(regex.lastIndex, regex.exec("123abc34def"));
console.log(regex.lastIndex, regex.exec("123abc34def"));
console.log(regex.lastIndex, regex.exec("123abc34def"));
console.log(regex.lastIndex, regex.exec("123abc34def"));

//log
0 [ '3a', '3', 'a', index: 2, input: '123abc34def', groups: undefined ]
0 [ '3a', '3', 'a', index: 2, input: '123abc34def', groups: undefined ]
0 [ '3a', '3', 'a', index: 2, input: '123abc34def', groups: undefined ]
0 [ '3a', '3', 'a', index: 2, input: '123abc34def', groups: undefined ]

带g的话,进行全局匹配,匹配的起始位置是从正则对象的 lastIndex 属性开始(第一次lastIndex为0)

var regex = /(\d)([a-z])/g;
console.log(regex.lastIndex, regex.exec("123abc34def"));
console.log(regex.lastIndex, regex.exec("123abc34def"));
console.log(regex.lastIndex, regex.exec("123abc34def"));
console.log(regex.lastIndex, regex.exec("123abc34def"));

//log
0 [ '3a', '3', 'a', index: 2, input: '123abc34def', groups: undefined ]
4 [ '4d', '4', 'd', index: 7, input: '123abc34def', groups: undefined ]
9 null
0 [ '3a', '3', 'a', index: 2, input: '123abc34def', groups: undefined ]

可以看出是否有g,对exec的打印结果内容无影响;但是有g时,String.match()就没有很多关键信息了(index,分组)
可以让 exec 配合 while 循环使用,全局匹配的同时,还能得到很多关键信息,两全其美!

var string = "2017.06.27";
var regex2 = /\b(\d+)\b/g;
var result;
while (result = regex2.exec(string)) {
  console.log(result, regex2.lastIndex);
}

//log
[ '2017', '2017', index: 0, input: '2017.06.27', groups: undefined ] 4
[ '06', '06', index: 5, input: '2017.06.27', groups: undefined ] 7
[ '27', '27', index: 8, input: '2017.06.27', groups: undefined ] 10

7. 构造函数

  • 一般不推荐使用构造函数生成正则,而应该优先使用字面量。因为用构造函数会多写很多 \ ,很多字符都需要转义
  • 修饰符需要单独作为参数转入
var string = "2017-06-27 2017.06.27 2017/06/27";
var regex = /\d{4}(-|\.|\/)\d{2}\1\d{2}/g;
console.log( string.match(regex) );

regex = new RegExp("\\d{4}(-|\\.|\\/)\\d{2}\\1\\d{2}", "g");
console.log( string.match(regex) );

//log
[ '2017-06-27', '2017.06.27', '2017/06/27' ]
[ '2017-06-27', '2017.06.27', '2017/06/27' ]

8. 正则实例对象属性

global是否为全局匹配
ignoreCase是否忽略大小写
multiline是否多行匹配
lastIndex上次匹配位置
source构建的实际正则
var regex = new RegExp("(^|\\s)high(\\s|$)", "img");
console.log(regex.global);
console.log(regex.ignoreCase);
console.log(regex.multiline);
console.log(regex.lastIndex);
console.log(regex.source);

//log
true
true
true
0
(^|\s)high(\s|$)

9. API的区别

API 的区别
String#searchString#splitString#matchString#replaceRegExp#testRegExp#exec
g是否有影响
lastIndex是否变化是(带g)
否(不带g)
是(带g)
否(不带g)
字符串自动转正则
(例如 . 变成了通配符)
\\


参考书籍:
《JavaScript正则表达式迷你书》 —— 老姚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1908102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.硬盘和内存区别

2.2 磁盘比内存慢几万倍? 存储器方面的设备,分类比较多,那我们肯定不能只买一种存储器,比如你除了要买内存,还要买硬盘,而针对硬盘我们还可以选择是固态硬盘还是机械硬盘。 相信大家都知道内存和硬盘都属…

Spring的AOP进阶。(AOP的通知类型、通知顺序、切入点表达式和连接点。)

3. AOP进阶 AOP的基础知识学习完之后,下面我们对AOP当中的各个细节进行详细的学习。主要分为4个部分: 通知类型通知顺序切入点表达式连接点 我们先来学习第一部分通知类型。 3.1 通知类型 在入门程序当中,我们已经使用了一种功能最为强大…

物理层与数据通信基础:构建稳定网络的关键

本章主要讨论物理层的基本概念、数据通信的基础知识、几种常用的信道复用技术以及互联网接入技术。对于具备通信基础知识的读者,可以有选择地学习本章内容。 本章重点内容 物理层的任务数据通信的基本概念常用的信道复用技术常用的互联网接入技术 2.1 物理层的基…

产品经理技能揭秘:如何巧妙启发需求,引领市场新潮流

文章目录 引言一、需求启发的定义二、需求启发的艺术三、需求启发的重要性四、需求启发的流程五、需求启发的问题与挑战内部自身的问题与挑战:挑战一:知识的诅咒挑战二:做与定义的不同挑战三:沟通障碍挑战四:需求变更频…

LabVIEW在半导体自动化测试中的应用

半导体制造的复杂性和精密度要求极高,每一个生产步骤都需要严格的控制和监测。自动化测试设备在半导体制造中起到了关键作用,通过精密测量和数据分析,确保产品质量和生产效率。本文介绍如何使用LabVIEW结合研华硬件,开发一个用于半…

磁致伸缩液位计的应用领域

磁致伸缩液位计作为一种高精度、高稳定性的液位测量设备,在众多行业中都有着广泛的应用。接下来,我们将从多个角度详细探讨磁致伸缩液位计在不同领域的应用情况。 石油化工行业 在石油化工行业中,磁致伸缩液位计主要用于储罐、反应器和管道等…

实用性提升百分之一百!!!【ONLYOFFICE 8.1版本】全方位深度性能测评

目录 【ONLYOFFICE 8.1 版本】全方位深度性能测评 一、界面与用户体验 二、文字处理功能 表格处理功能 演示文稿功能 协作与共享功能 性能与稳定性 总结 【ONLYOFFICE 8.1 版本】全方位深度性能测评 在当今数字化办公的时代,办公软件的选择对于提高工作效率和…

全卷积网络之FCN图像语义分割

前言 FCN是一种用于图像语义分割的全卷积网络,可以端到端进行像素级预测。 语义分割 图像语义分割是图像处理和机器视觉技术中的重要一环,旨在对图像中的每个像素进行分类。与普通的分类任务不同,语义分割任务输出与输入大小相同的图像&…

ERP、CRM、MRP、PLM、APS、MES、WMS、SRM系统之间的关系

ERP系统是企业运营的神经中枢,整合了财务、人力资源、供应链等关键业务流程。CRM系统作为客户关系管理的专家,帮助企业深入了解客户需求,提升服务质量。MRP是物料需求的规划师,确保生产所需材料及时供应。PLM系统守护着产品从设计…

使用 Hugging Face 模型时遇到的问题

题意: I load a float32 Hugging Face model, cast it to float16, and save it. How can I load it as float16? 我加载了一个float32的Hugging Face模型,将其转换为float16,并保存了。我该如何以float16的形式加载它呢? 问题…

React@16.x(51)路由v5.x(16)- 手动实现文件目录参考

作为前面几篇文章的参考: 实现 Router实现 Route实现 Switch实现 withRouter实现 Link 和 NavLink 以上。

2024年06月CCF-GESP编程能力等级认证Python编程三级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证…

海南云亿商务咨询有限公司口碑怎么样?

在数字化浪潮席卷全球的今天,电商行业正以前所未有的速度发展。抖音作为短视频领域的佼佼者,其电商功能更是为众多品牌和企业打开了全新的销售渠道。海南云亿商务咨询有限公司,作为抖音电商服务领域的佼佼者,正以其专业的服务和创…

PHP源码:新闻门户系统(附管理后台+前台)

一. 前言 今天小编给大家带来了一款可学习,可商用的,新闻门户系统 源码,支持二开,无加密。项目可以扩展为个人博客,和一些社交论坛网址。主要功能:支持文章管理,评论管理,分类管理等…

kafka系列之offset超强总结及消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用Spring的KafkaListener(其实底层也是poll()方法)注解消费Kafka消息时,它都会返回之前被写入Kafka的记录,即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前…

安全防御第三天(笔记持续更新)

1.接口类型以及作用 接口 --- 物理接口 三层口 --- 可以配置IP地址的接口 二层口 普通二层口 接口对 --- “透明网线” --- 可以将一个或者两个接口配置成为接口对,则 数据从一个接口进,将不需要查看MAC地址表,直接从另一个接口出&#xff1b…

找回消失的SOLIDWORKS PDM“蓝莓”图标

SOLIDWORKS 产品数据管理 (PDM) 解决方案可帮助您控制设计数据,并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional,您的团队能够:1. 安全地存储和索引设计数据以实现快速检索;2. 打消关…

springboot解压文件流zip压缩包

springboot解压文件流zip压缩包 原始文件存储的地方&#xff1a; 需要在当前目录下解压该文件&#xff0c;如下图&#xff1a; 代码示例&#xff1a; private Result<String> getLocationGuideLayerName(YbYstbtqTaskResolveParam params, String fishnetLayerName)…

212.贪心算法:跳跃游戏(力扣)

代码解决 class Solution { public:bool canJump(vector<int>& nums) {int cover 0; // 初始化覆盖范围if (nums.size() 1) return true; // 如果数组长度为1&#xff0c;直接返回 true// 遍历数组&#xff0c;直到当前覆盖范围for (int i 0; i < cover; i…

黑马点评商户缓存查询作业——Redis中查询商户类型

记录下自己在gpt帮助下完成的第一个需求~~~ 1. ShopTypeController 2. IShopTypeService 3. ShopTypeServiceImpl&#xff08;模仿ShopServiceImpl来写的&#xff09; 一共分为“1.redis中查询缓存”→“2.判断缓存是否存在&#xff0c;存在直接返回”→“3.缓存不存在则去查数…