百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

正则表达式进阶

xsobi 2025-01-06 16:08 1 浏览

正则表达式,是每个程序员的必备的技能

1. 贪婪匹配 和 惰性匹配

  • 贪婪匹配是尽可能匹配更多的字符
  • 惰性匹配是尽可能匹配更少的字符

惰性匹配是在 * , + , {m,} 后加上 ?

  • *: 匹配前面 0 次或以上,尽可能多
  • +: 匹配前面 1 次或以上,尽可能多
  • {m,}: 匹配前面 m 次或以上,尽可能多
  • *?: 匹配前面 0 次或以上,尽可能少
  • +?: 匹配前面 1 次或以上,尽可能少
  • {m,}?: 匹配前面 m 次或以上,尽可能少

1.1 举例

字符串

1
1a-2b-3c-4d-e5-f6

除了 - 外,其他字符串都是不定长的,而且字符串也可以是其他除 - 外的字符甚至特殊符号

  • 贪婪匹配

表达式:^.+\-

匹配值:1a-2b-3c-4d-e5-

  • 惰性匹配

表达式:^.+?\-

匹配值:1a-

1.2 惰性匹配顺序问题

前面的例子,如果想匹配后面的 -f6,你可能会这样用

1
\-.+?$

但匹配结果是 -2b-3c-4d-e5-f6 而不是 -f6,和贪婪匹配结果一样

这是因为正则匹配是从前往后,当匹配到 -2 时发现匹配了一部分,就会继续向前查询 -2d > -2d- > -2d-3 > -2d-3c 等,直到查询 -2b-3c-4d-e5-f6 才找到满足条件的值

为了解决这个问题,可以用排除法,即排除前面的 -

1
\-[^\-]+$

2. 字符串掐头去尾

在代码中,如果想去除字符串前面一部分,或者字符串后面一部分,可以用 正则 + 替换 的方式

文件名

1
image.png
  • 若只想要不带扩展名的名称,在 JS 中可以这样
1
\..+$
1
2
3
const file = "image.png"
const name = file.replace(/\..+$/, "");
console.log(name); // image
  • 如果文件名中可能包含多个 .
1
image.1.png

按上面的写法只能取到 image 而不是 image.1

这样做保留的文件名更完整

1
\.+[^\.]*$
1
2
3
const file = "image.1.png"
const name = file.replace(/\.+[^\.]*$/, "");
console.log(name); // image
  • 如果只想保留扩展名,可以这样
1
^.*\.
1
2
3
const file = "image.png"
const extended = file.replace(/^.*\./, "");
console.log(extended); // png

3. 环视

也称为零宽度断言,环视可以根据某个模式之前或之后的内容,要求匹配其他模式

3.1 正前瞻

匹配且要求紧随其后的内容为分组匹配的内容

1
?=分组

[a-zA-Z](?=\d) ,若字母是数字则匹配该字母 ,否则匹配,即 [a-z] 必须匹配 \d

3.2 反前瞻

对正前瞻含义取反,即匹配且要求紧随其后的内容不为分组匹配的内容

1
?!分组

[a-zA-Z](?!\d) ,若字母是数字则匹配该字母 ,否则匹配,即 [a-z] 后必须匹配 \d

3.3 正前顾

即对正前瞻方向取反,匹配且要求紧挨着之前的内容为分组匹配的内容

1
?<=分组

(?<=\d)[a-zA-Z] ,若字母是数字则匹配该字母 ,否则匹配,即 [a-z] 必须匹配 \d

3.4 反后顾

即对正前瞻方向取反,匹配且要求紧挨着之前的内容为分组匹配的内容

1
?<!分组

(?<!\d)[a-zA-Z] ,若字母是数字则匹配该字母 ,否则匹配,即 [a-z] 必须匹配 \d

4. 正向引用

子匹配可以被引用,使用 \n 访问

abcd<custom-button>link</custom-button>efg 匹配 custom-button 标签和其中的内容

1
<(custom-button)>.*</\1>

博客:https://blog.hal.wang/92f1340d 「链接」

相关推荐

听说你还不知道Java代码是怎么运行的?

作者:Jay_huaxiao前言作为一名Java程序员,我们需要知道Java代码是怎么运行的。最近复习了深入理解Java虚拟机这本书,做了一下笔记,希望对大家有帮助,如果有不正确的地方,欢迎提出,感激...

如何开始学习JAVA编程?

#记录我的9月生活#...

java后端开发需要学什么?

Java属于后端开发中最常见的语言之一,Java这种语言的体系比较中立,而且具备了构建多线程的能力,在许多大型互联网平台Java的应用范围特别广泛。  java后端主要涉及到如下4个技术:  第一、S...

细思极恐:你真的会写Java吗?

导语自2013年毕业后,今年已经是我工作的第4个年头了,总在做java相关的工作,终于有时间坐下来,写一篇关于java写法的一篇文章,来探讨一下如果你真的是一个java程序员,那你真的会写java吗?...

七年Java开发的一路辛酸史:分享面试京东、阿里、美团后的心得

前言我觉得有一个能够找一份大厂的offer的想法,这是很正常的,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司...

我把Java基础编程及思维导图整理的超级详细,小白都能看懂

Java基础编程及其思维导图目录:Java学习导图一、Java基本语法1.关键字与标识符2.变量分类3.运算符4.流程控制二、数组1.数组概述2.一维数组3.二维数组4.数组常见算法5....

Java 开发中的 9 个实用技巧:案例详解

Java开发中,总有一些技巧能够帮助我们提高代码质量和开发效率。下面,我们来分享9个Java技巧,每个技巧都附上实际案例,帮助你在工作中立刻应用。1.合理使用final关键字...

Java 20年,以后将往哪儿走?

在今年的Java20周年的庆祝大会中,JavaOne2015的中心议题是“Java的20年”。甲骨文公司Java平台软件开发部的副总裁GeorgesSaab的主题演讲就将关注点放在了java...

推荐1个java快速开发项目,让你接私活不用愁

??大家好,我是小编南风吹,每天推荐一个小工具/源码,装满你的收藏夹,让你轻松节省开发效率,实现不加班不熬夜不掉头发!...

教你用Java开发一个简单的JVM

一、前言几年前,接到一个开发任务:用Java开发能运行Java智能合约的虚拟机。在开发Java智能合约时,只能使用智能合约SDK提供的类和一些Java常用类(8种基本数据类型包装类;String、Bi...

java实战教程(一)软件开发流程&amp;开发模式

这里小编为了方便处于不同学习阶段的童鞋,准备了三个系列的文章,java系列教程、java实战教程、java进阶教程,对于刚入坑的童鞋,可以先按照这三个系列教程一步步的了解,循序渐进,java实战系列教...

Java 核心技术之入门指南:全面解析Java概述

大家好,这里是Java码牛!Java核心技术入门:全面解析Java概述一、引言Java,作为一门在当今信息技术领域中被广泛应用于企业级开发的主流编程语言,其核心技术的精准掌握对于众多开发者而言,具有...

小白如何轻松上手Java开发?

Java,这款流行的编程语言,被广大开发者所钟爱。但对于初学者来说,如何入门确实是一个大问题。尤其对于毫无经验的小白,从何处开始、如何推进,都是关键。本文将带你走进Java的世界,为你揭示从零到一的进...

初学Java应该知道的知识点:Java的程序开发是什么?

Java的程序开发是什么呢?下面和千锋广州小编一起来看看吧!一般来说,Java的程序开发包括三个步骤:编写程序,编译程序,运行程序编写程序——Java源代码,.Java文件编译程序——Javac用来进...

厉害了!全靠经典之作-Java编程思想,把小白教的明明白白

今天我们来聊聊这本《Java编程思想》从我学习Java的经验来看,《ThinkinginJava》是讲解Java编程的最佳书籍!  这本书不仅详细地介绍Java语法、知识点、API类库使用,更...