JS正则03——js正则的贪婪匹配模式与非贪婪匹配模式➕正向预测匹配和负向预测匹配的详细使用及例子

news2024/11/18 17:45:08

JS正则03——js正则的贪婪匹配模式与非贪婪匹配模式➕正向预测匹配和负向预测匹配的详细使用及例子

  • 1. 前言
    • 1.1 js正则的基本使用
  • 2. 贪婪匹配模式 与 非贪婪匹配模式
    • 2.1 引例
    • 2.2 贪婪模式
    • 2.3 非贪婪模式
    • 2.4 原理——参考
  • 3. 预测匹配方式
    • 3.1 正向预测匹配
    • 3.2 负向预测匹配
      • 3.2.1 简述
      • 3.2.2 负向预测匹配的方法
        • 3.2.2.1 负向预测匹配符号(^)
        • 3.2.2.2 结合其他正则表达式元字符

1. 前言

1.1 js正则的基本使用

  • 关于基本使用,请看下面的两篇文章:
    JS正则01——JS正则表达式中各元字符的详细介绍以及常用的js正则示例.

    JS正则02——js正则表达式中常用的方法、常见修饰符的使用详解以及各种方法使用情况示例.

2. 贪婪匹配模式 与 非贪婪匹配模式

2.1 引例

  • 看如下输出结果,了解贪婪模式与非贪婪模式

    alert( "123".match(/\d+/) ); // 输出:123
    alert( "123".match(/\d+?/) ); // 输出:1
    
    alert( "123".match(/\d*/) ); // 输出:123
    alert( "123".match(/\d*?/) ); // 输出:空
    
    alert( "123".match(/\d?/) ); // 输出:1
    alert( "123".match(/\d??/) ); // 输出:空
    
    alert( "123".match(/\d{2,}/) ); // 输出:123
    alert( "123".match(/\d{2,}?/) ); // 输出:12
    
    alert( "123 456".match(/\d+? \d+?/g) ); // 输出:123 4
    alert( "123 456".match(/\d+? \d+?/) ); // 输出:·123 4
    

2.2 贪婪模式

  • 贪婪模式是默认的匹配方式,它会尽可能多地匹配符合条件的字符。在正则表达式中,使用量词(如*+?{n,}等)时,默认会匹配尽可能多的字符。
    例如,对于正则表达式 /a+/,如果应用于字符串 “aaa”,贪婪模式会匹配到所有的 “a”,即 “aaa”。

2.3 非贪婪模式

  • 非贪婪模式是通过在量词后面添加一个问号(?)来实现的。它会尽可能少地匹配符合条件的字符。
    例如,对于正则表达式 /a+?/,如果应用于字符串 “aaa”,非贪婪模式会匹配到第一个 “a”,即 “a”。

  • 量词的惰性模式与贪婪模式相反。它的意思是:“重复最少次数”。

  • 我们可以通过在量词后面添加一个问号 ? 来启用它,这样它就变成 *?+? 甚至 ??

    说清楚一点:通常问号 ? 本身就是一个量词(零或一),但如果在另一个量词(甚至它本身)之后添加它,它就会有另一个含义 - 它将匹配模式从贪婪切换懒惰

2.4 原理——参考

  • 如果想了解正则表达式引擎匹配原理,可以看下面的官网,写得非常详细,如下:

    https://javascript.info/regexp-greedy-and-lazy.

  • 官网提供一个例子,要在a "witch" and her "broom" is one匹配出带引号的单词(包括引号本身),如下:

    • 贪婪模式下——因为贪心搜索,未实现效果:

      let regexp = /".+"/g;
      
      let str = 'a "witch" and her "broom" is one';
      
      alert( str.match(regexp) ); // 输出:"witch" and her "broom"
      
      • 解释:
        在贪婪模式下(默认情况下),量化字符会重复尽可能多的次数。

        正则表达式引擎会为 .+ 添加尽可能多的字符,然后在模式的其余部分不匹配时将其一一缩短。

    • 非贪婪模式下:

      let regexp = /".+?"/g;
      
      let str = 'a "witch" and her "broom" is one';
      
      alert( str.match(regexp) ); // 输出:"witch", "broom"
      
      • 解释:
        量词 *??? 的工作方式类似 - 仅当模式的其余部分无法在给定位置匹配时,正则表达式引擎才会增加重复次数在这里插入图片描述
    • 替代方法:
      在上面的例子中,我们可以使用正则表达式 "[^"]+" 找到没有惰性模式的带引号的字符串,如下:

      let regexp = /"[^"]+"/g;
      
      let str = 'a "witch" and her "broom" is one';
      
      alert( str.match(regexp) ); // 输出:"witch", "broom"
      
      • 解释:
        正则表达式 "[^"]+" 给出了正确的结果,因为它查找引号 '"' ,后跟一个或多个非引号 [^"] ,然后是结束引号。

        当正则表达式引擎查找 [^"]+ 时,它会在遇到结束引号时停止重复,我们就完成了。

3. 预测匹配方式

3.1 正向预测匹配

  • 正向预测匹配
    • 使用正向预测匹配可以判断某个位置之后是否存在满足条件的内容,但不会将该内容包含在最终的匹配结果中。
    • 正向预测匹配使用(?=pattern)的语法形式,其中pattern为要预测的模式。
  • 例子1——匹配字符串中所有以数字结尾的单词,但不包括数字在内。可以使用正向预测匹配来实现,如下:
    const str = "I123 love456 you789 0-I 1-also 2-hate 3-you";
    const pattern = /[a-zA-Z]+(?=\d)/g;  //以数字结尾的单词
    const matches = str.match(pattern);
    console.log(matches); // 输出: ['I', 'love', 'you']
    
  • 例子2——匹配匹配必须包含大小写、数字、下划线的任意3种组合的6位
    • 这个参考第一篇文章中的例子《3.3 其他正则(字符混合正则)》,如下:
      JS正则01——JS正则表达式中各元字符的详细介绍以及常用的js正则示例.

3.2 负向预测匹配

3.2.1 简述

  • 使用负向预测匹配可以帮助我们排除某些模式,即在匹配过程中排除我们不想要的内容。
  • 负向预测匹配使用(?!pattern)的语法形式。

3.2.2 负向预测匹配的方法

3.2.2.1 负向预测匹配符号(^)
  • 在正则表达式中,可以使用^符号来表示负向预测匹配。例如,如果我们想要匹配不包含特定单词的字符串,可以使用如下正则表达式 :
    /^(?!.*特定单词).*/   // 这个正则表达式将匹配任意字符串,但不包含"特定单词"。
    
  • 例子——匹配校验不包含数字,如下:
    const str = "Hello2, World!@";
    // const pattern = /^(?!.*\d).*$/;  
    const pattern = /^(?!.*\d).*/;   // 正则不含数字
    
    console.log(pattern.test(str)); // 输出 false
    
3.2.2.2 结合其他正则表达式元字符
  • 负向预测匹配可以与其他正则表达式元字符结合使用,以实现更复杂的模式排除。例如,我们可以使用负向预测匹配和边界元字符(\b)来排除包含特定单词的完整单词。正则表达式语法如下:
    \b(?!特定单词\b)\w+\b
    
  • 例子——匹配字符串中所有不以数字结尾的单词(注意:对比上面的正向预测例子)
    const str = "I123 love456 you789 0-I 1-also 2-hate 3-you";
    
    // 下面三种写法均可实现
    // const pattern = /[a-zA-Z]+(?!\d)/g;
    const pattern = /\b[a-zA-Z]+(?!\d)\b/g; // 注意:使用负向预测匹配和边界元字符(\b)来排除包含特定单词的完整单词
    // const pattern = /\b(?!\d)[a-zA-Z]+\b/g; 
    
    const matches = str.match(pattern);
    
    console.log(matches); // 输出:  ['I', 'also', 'hate', 'you']
    

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

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

相关文章

试手一下CameraX(APP)

书接上回。 首先还是看谷歌的官方文档: https://developer.android.com/media/camera/camerax?hlzh-cn https://developer.android.com/codelabs/camerax-getting-started?hlzh-cn#1 注:这里大部分内容也来自谷歌文档。 官方文档用的是Kotlin&…

Window下编写的sh文件在Linux/Docker中无法使用

Window下编写的sh文件在Linux/Docker中无法使用 一、sh文件目的1.1 初始状态1.2 目的 二、过程与异常2.1 首先获取标准ubuntu20.04 - 正常2.2 启动ubuntu20.04容器 - 正常2.3 执行windows下写的preInstall文件 - 报错 三、检查和处理3.1 评估异常3.2 处理异常3.3 调整后运行测试…

不知道RAID/SAN/NAS的小可爱来看看这个吧!

RAID RAID(冗余阵列的独立磁盘,Redundant Array of Independent Disks)是一种将多个磁盘驱动器组合成一个或多个单元的技术,目的是在提高数据可靠性和/或提升性能的同时,对操作系统隐藏底层的复杂性。简而言之&#x…

Vue3中Vuex状态管理库学习笔记

1.什么是状态管理 在开发中,我们会的应用程序需要处理各种各样的数据,这些数据需要保存在我们应用程序的某个位置,对于这些数据的管理我们就称之为状态管理。 在之前我们如何管理自己的状态呢? 在Vue开发中,我们使用…

“比特币暴拉冲破6.5万美元”!超罕见指标揭示牛市信号,18万美元目标能否实现?

比特币(BTC)周末持续在6.2万美元反复震荡之后,今(4)晨再次强势拉涨,早上8:45左右最高触及64268美元,随后插针盘整,下午5点30分左右突破65500美元,再创今年新高…

第七届电路,系统与仿真国际会议(ICCSS 2024)即将召开!

2024年第七届电路,系统与仿真国际会议(ICCSS 2024)将于5月17-19日马来西亚博特拉大学举办。本届会议由马来西亚博特拉大学和中国东南大学协办,电机与电子工程系主办。ICCSS 2024 热烈欢迎所有来自电路、系统和仿真等相关领域的研究…

Java基于springboot的课程作业管理系统

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景,运用软件工程原理和开发方法…

书生浦语全链路开源体系

推荐阅读论文 A Survey Of Large Language Models 书生浦语开源的模型 从模型到应用 书生浦语开源体系 书生万卷开源数据集 除此之外还有OpenDataLab国内数据集下载网站。 预训练框架InterLM-Train 微调框架XTuner 评测工具体系 国内外常见的大语言模型评测基准&#xff1a…

如何扫码查看图片信息?图片放到二维码展示的在线教学

现在通过扫码来查看物品图片是很常用的一种方式,将物品不同角度的图片存入一张二维码后,用户只需要扫描这张二维码图片,就可以了解物品预览图及其他信息。常用的图片格式比如jpg、png、gif都可以放到二维码中显示,那么具体该怎么做…

如何在飞书接入ChatGPT并结合内网穿透实现公网远程访问智能AI助手

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话,在下面操作步骤中…

column ‘_id‘ does not exist

最近把 csv 导入 SQLite 给 CursorAdapter 使用出现了这个莫名其妙的错误。 java.lang.IllegalArgumentException: column _id does not exist-CSDN博客 查找资料才明白:CursorAdapter 使用的数据库中必须有 _id 这个字段。 好吧,导入的数据库增加 _i…

为何代理IP的稳定性不如有线IP?

代理IP与网线IP的稳定性之间存在差异的原因在于它们的工作机制和服务环境的不同。以下是代理IP不如网线IP稳定的一些主要原因: 1. 服务提供商的质量: - 动态分配:代理IP通常是动态分配的,这意味着每次请求或每隔一段时间&#xff…

2.00001《Postgresql内幕探索》走读 之 查询优化

文章目录 1.1 概述1.1.1 Parser1.1.2 分析仪/分析器1.1.3 Rewriter1.1.4 Planner和Executer 1.2 单表查询的成本估算1.2.1 顺序扫描1.2.2 索引扫描1.2.3 排序 1.3 .创建单表查询的计划树1.3.1 预处理1.3.2 获取最便宜的访问路径示例1示例二 1.3.3 创建计划树示例1例二 1.4 EXEC…

python学习27

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

Redis安装与数据类型及常用命令

一、关系数据库和非关系型数据库1、关系型数据库2、非关系型数据库3、非关系型数据库产生背景4、关系型数据库和非关系型数据库区别5、为什么非关系型数据库能提升访问速度? 二、Redis简介1、Redis 的优点2、使用场景3、哪些数据适合放入缓存中?4、Redis…

芯片ERP:应用广泛的领域及其影响

在现代科技快速发展的时代,芯片ERP(企业资源规划)已成为许多行业不可或缺的工具。这种集成了先进技术和先进管理理念的系统,极大地提高了企业的运营效率和竞争力。那么,芯片ERP主要应用在哪些领域呢?本文将为您一一揭晓。 一、电子制造行业 …

啤酒:精酿啤酒与烤串的夜晚滋味

夏日的夜晚,微风拂面,星光璀璨。此时,能抚慰人心的莫过于与三五好友围坐一起,享受烤串与Fendi Club啤酒的美味。这种滋味,不仅仅是味蕾的盛宴,更是心灵的满足。 Fendi Club啤酒,每一滴都蕴含着大…

python标识符、变量和常量

一、保留字与标识符 1.1保留字 保留字是指python中被赋予特定意义的单词,在开发程序时,不可以把这些保留字作为变量、函数、类、模块和其它对象的名称来使用。 比如:and、as、def、if、import、class、finally、with等 查询这些关键字的方…

指针习题二

使用函数指针实现转移表 #include <stdio.h> int add(int a, int b) {return a b; } int sub(int a, int b) {return a - b; } int mul(int a, int b) {return a * b; } int div(int a, int b) {return a / b; } int main() {int x, y;int input 1;int ret 0;int(*p[…

SwiftUI 如何在运行时从底层动态获取任何 NSObject 对象实例

概览 众所周知,SwiftUI 的推出极大地方便了我们这些秃头码农们搭建 App 界面。不过,有时我们仍然需要和底层的 UIKit 对象打交道。比如:用 SwiftUI 未暴露出对象的接口改变视图的行为或外观。 从上图可以看到,我们 SwiftUI 代码并没有设置视图的背景色,那么它是怎么变成绿…