Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >正则表达式之入门篇

正则表达式之入门篇

原创
作者头像
黄Java
修改于 2018-11-01 12:54:17
修改于 2018-11-01 12:54:17
4850
举报
文章被收录于专栏:黄Java的地盘黄Java的地盘

概述

本文主要通过对正则表达式的语法进行一些简单的介绍,从而让没有接触过或者想学习正则表达式的同学有一个基础的了解,从而能够看懂和编写使用一般的正则表达式。

本文的主要内容为:

  • 正则表达式的字符匹配
  • 正则表达式的位置匹配
  • 正则表达式的括号与捕获组

本文的主要受众是想要学习正则表达式又不知道从何入手的同学。如果你已经使用过正则表达式,可以快速浏览本文,强化自己的记忆即可。

字符匹配

匹配规则

在正则表达式中,分为精确匹配和模糊匹配两种。顾名思义,精确匹配就是匹配特定的字符或者位置;而非精确匹配就是带有一定的范围的匹配。具体示例如下:

代码语言:txt
AI代码解释
复制
const reg1 = /ab/; //精确匹配

const reg2 = /ab+/; //模糊匹配

不同的匹配适用于不同的场景,大家根据自己的需求进行选择即可。

字符组

在正则表达式中,我们经常会遇到从N个字符里面选取任意字符进行匹配的需求。这个时候,我们就需要一个字符组。具体示例如下:

代码语言:txt
AI代码解释
复制
const reg = /[abc]/; // 与上面示例完全相同,匹配a或b或者c

当匹配的字符多了以后,我们不可能全部都列到字符组里,因此我们可以使用范围表示法。具体示例如下:

代码语言:txt
AI代码解释
复制
const reg = /[a-c]/; // 匹配a或b或c

相同类的字符可以用范围,如1-9、A-Z或者a-z。在字符组中,-是一个特殊字符,如果需要匹配-,则需要使用\进行转义。

当然,如果我们是不想匹配N个字符中的任意一个,我们可以用排除字符组的方式来进行匹配。具体示例如下:

代码语言:txt
AI代码解释
复制
const reg = /[^abc]/; // 不匹配a、b、c中任意一个

排除字符组中也可以使用范围。

量词

当我们需要匹配单个字符时,我们可以使用上面示例中的方法。但是,如果我们需要匹配单个字符若干次呢?最简单的方法就是将匹配的正则表达式写若干次,但是这样不仅费时费力,还不方便阅读。因此,正则表达式中使用了量词来表示重复匹配N次的情况。

量词含义如下:

  • {m, },至少出现m次。
  • {m, n},最少出现m次,最多出现n次(最多出现N次的写法为{0, n},而不是{, n})
  • ,匹配0或者1次
  • +,最少匹配1次,与{1, }等价
  • *,匹配任意次,与{0, }等价

了解了上述量词,下面我们来看下这些量词在示例中到底是如何应用的:

代码语言:txt
AI代码解释
复制
const reg1 = /a+/; //至少匹配一次a

const reg2 = /a?b*/; //匹配0或者1次a,再匹配任意次的b

现在问题来了,上面示例中的/a+/这个正则表达式,如果遇到了字符串'aaa',那么得到的匹配结果是什么呢?这个就涉及到了我们下一节要介绍的内容。

贪婪匹配与非贪婪匹配

贪婪匹配:所有的量词都会尽可能多的进行匹配,默认值。以/a+/'aaa'为例,匹配的结果是'aaa'

非贪婪匹配:所有的两次都会尽可能少的匹配。以/a+?/'aaa'为例,匹配的结果是'a'

因为贪婪匹配是默认值,所以当我们写正则表达式时,默认就是贪婪匹配。那么我们应该如何来表示非贪婪匹配呢?具体示例如下:

代码语言:txt
AI代码解释
复制
const reg1 = /a+/; //贪婪匹配

const reg2 = /a+?/; // 非贪婪匹配

通过上面的示例我们可以看到,我们只需要在两次后加上一个?,就表示是一个非贪婪匹配。

注:非贪婪匹配只会向后作用,不会向前作用。即\/a+?bb\/匹配'aabb'是'aabb',而不是'abb';而\/aab+?\/则是匹配'aab'。(这个与正则表达式匹配和回溯的原理有关,有兴趣的可以阅读我的下一篇关于正则表达式的博客)

分支逻辑

在一个正则表达式中,我们会遇到做选择的情况。单个元素进行选择时,我们可以使用字符组。但是,如果需要多个元素比如ab或者cd进行选择时,这个时候我们就需要分支逻辑。具体示例代码如下:

代码语言:txt
AI代码解释
复制
const reg = /ab|cd/; //表示选择ab或者cd。为什么不是b和c呢?这个我们在下一篇博客——进阶篇中将会讲述操作符优先级问题。

位置匹配

正则表达式除了捕获字符,还可以捕获字符串中的位置。所谓的位置,指的就是两个字符之间。比如'ab'这个字符串,就有3个位置,分别位于a前面、a后面b前面和b后面。如果我们将位置当成是一个空字符串'',其实对于位置的匹配也可以归纳到对字符的匹配中。

匹配位置的方式也有不少,我们来看下:

  • ^,匹配开头,多行模式下匹配行开头,即每行开头都会被匹配。
  • $,匹配结尾,多行模式下匹配行结尾,即每行结尾都会被匹配。
  • \b\w\W之间的位置(\w表示0-9A-Za-z,而\W就是\w的补集),包括开头结尾(即也包括\w^之间的位置,和\w$之间的位置)
  • \B,与\b相反,\w\w之间的位置,和\W\W之间的位置,包括开头结尾(相对的,即包括\W^之间的位置,和\W$之间的位置)
  • (?=p),正向肯定断言。p是一个子模式,匹配要在p这个模式之前的位置
  • (?!p),正向否定断言。与(?=p)相反,匹配不要在p这个模式之前的位置

上面说了这么多,下面我们通过一个示例来一下:

代码语言:txt
AI代码解释
复制
const reg1 = /^ab/; //对于字符串'abab'来说,只会匹配到开头的'ab'
const reg2 = /ab$/; //对于字符串'abab'来说,只会匹配到结尾的'ab'
const reg3 = /\b/; //对于字符串'a b'来说,会匹配到'a'前面的位置、'a'和' '之间的位置、' '和'b'之间的位置、'b'后面的位置
const reg4 = /\B/; //对于字符串'aa bb[/来说,会匹配到'a'和'a'之间的位置、'b'和'b'之间的位置、'['后面的位置
const reg5 = /(?=a)/; //对于字符串'bac'来说,会匹配到'a'之前的位置
const reg6 = /(?!a)/; //对于字符串'bac'来说,会匹配到'b'之前的位置、'c'之前的位置以及'c'之后的位置

通过上面的例子,大家应该能够理解正则表达式在捕获位置时候所发挥的作用。

ES2018新特性

在ES2018中,增加了反向肯定断言反向否定断言。具体格式如下:

  • (?<=p),反向肯定断言。p是一个子模式,匹配要在p模式之后的位置
  • (?<!p),反向否定断言。与(?<=p)相反,匹配不要在p模式之后的位置

我们通过一个具体的示例来看下:

代码语言:txt
AI代码解释
复制
const reg1 = /(?<=a)b/ //对于字符串'abb'来说,只会匹配到'a'和'b'之间的位置。
const reg2 = /(?<=a)b/ //对于字符串'abb'来说,会匹配到'b'和'b'之间的位置。

括号与捕获组

在正则表达式中,括号是一个功能非常多的操作符。本章我们将会详细介绍正则表达式中的括号的各种作用。

提高优先级

在正则表达式中,运算符操作也有优先级之分,如下例所示:

代码语言:txt
AI代码解释
复制
const reg1 = /ab|cd/; //匹配'ab'或者'cd'
const reg2 = /a(b|c)d/;//匹配'a'后,匹配一个'b'或者'c',再匹配一个'd'

关于正则表达式优先级相关的讨论,我们在此就不做展开了,有兴趣的同学可以阅读我的后一篇关于正则表达式高级进阶的文章。

捕获组与非捕获组

如果我们在正则表达式中,我们需要获取特定的匹配内容,那么我们就要用到捕获组。捕获组通常使用(p),其中p是一个子模式,表示需要捕获的内容。具体使用示例如下:

代码语言:txt
AI代码解释
复制
const reg = /a(bc)d/;

let result = 'abcd'.match(reg); // 得到的result[1]就是第一个捕获组匹配的字符'ab'

但是,如果我们在一些需要保证优先级的地方使用了小括号,但是又不想成为捕获组来干扰匹配,我们应该怎么办呢?这个时候我们就需要非捕获组。我们只需要在括号最开始加上一个?即可。具体使用示例如下:

代码语言:txt
AI代码解释
复制
const reg = /a(?:bc)d/;

let result = 'abcd'.match(reg); // 得到的result没有捕获组

反向引用

当我们在正则表达式中需要使用前面捕获组匹配的内容时,我们可以使用反向引用。这在匹配一些成对的字符如'"等时非常有效。具体使用方式如下:

代码语言:txt
AI代码解释
复制
const reg = /(a)b\1/; //匹配字符'aba'

这里需要注意的有三点:

  1. 如果出现括号嵌套的情况,那么从左到右以第一个括号(即左开括号)的顺序为准。
  2. \10表示的含义为第10个捕获组,而不是第一个捕获组加上一个字符0。需要表示后者可以用/(\1)0/。即使是在第三种情况下,转移符优先级仍然高于字符顺序。
  3. 如果在正则表达式中出现的捕获组个数小于使用的捕获组,那么\字符就会被当成一个转移符而非反向引用。注:\2表示对2进行转义的话,不同的浏览器对转义后的结果是不一样的。下图是Chrome浏览器转义后的结果
image.png
image.png

总结

通过阅读本文,你已经学到了正则表达式的最基础的语法和使用规则。如果你想提高正则表达式的效率,加快正则表达式的阅读和理解,可以阅读正则表达式系列第二篇文章。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 中的 Filter 过滤器详解
Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Java团长
2018/07/23
1.7K0
java过滤器Filter「建议收藏」
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应 (Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的 web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁,以下通过代码示例来了解它 的使用。
全栈程序员站长
2022/06/27
5590
Javaweb核心之servlet规范过滤器-----Filter
过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。
楠羽
2022/11/18
4320
Javaweb核心之servlet规范过滤器-----Filter
实现Struts2中对未登录的jsp页面进行拦截功能(采用的是Struts2中过滤器进行过滤拦截)
Struts2中拦截器大家都很经常使用,但是拦截器只能拦截action不能拦截jsp页面。这个时候就有点尴尬了,按道理来说没登录的用户只能看login界面不能够通过输入URL进行界面跳转,这显然是不合理的。这里介绍Struts2中Filter实现jsp页面拦截的功能。(有兴趣的人可以去研究Filter过滤器的其它用法,因为利用过滤器也可以实现action拦截的功能)
林老师带你学编程
2022/11/30
1K0
Servlet过滤器,Servlet过滤器创建和配置
第一:Servlet的过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的3个方法。        第一方法是过滤器中的init()方法用
别先生
2017/12/29
9900
Servlet过滤器,Servlet过滤器创建和配置
Servlet 过滤器和异常处理
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。
Carlos Ouyang
2019/08/19
1.2K0
Servlet 过滤器和异常处理
拦截器(Interceptor)与过滤器(Filter)
  拦截器是面向切面(AOP)编程中应用的一种统一处理方案,就是在你的Controller、Servie或者一个Method调用一个Method,或者在Method调用一个Method之后,统一的进行处理的方案,基于Java的反射机制。
BUG弄潮儿
2021/06/25
4.9K0
拦截器(Interceptor)与过滤器(Filter)
Servlet过滤器笔记
实现Servlet过滤器关键有两点,实现Filter接口,在web.xml中配置过滤器。
SuperHeroes
2019/03/12
3440
Servlet总结四(过滤器)
文章目录 1. Servlet总结四(过滤器的使用) 1.1. 简介 1.2. 过滤器的实现 1.2.1. 重点 1.2.2. 简单的例子 1.2.3. 过滤器的设置 1.2.3.1. 注意 1.2.4. 初始参数的设置和获取 1.2.4.1. 设置初始值 1.2.4.2. 获取初始参数的值 1.2.5. 设置触发的时机 Servlet总结四(过滤器的使用) 简介 在容器调用Servlet的service()的方法钱,Servlet其实并不会知道有请求的到来,而在service()方法执行后,容器真正
爱撒谎的男孩
2019/12/31
4000
Servlet与过滤器
Server+Applet,是一种服务器端的Java应用程序 只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet
xiaozhangStu
2023/05/04
2840
Java Web Servlet过滤器
  过滤器就是可以对浏览器向jsp,servlet,html等这些web资源发出请求和
Hongten
2018/09/13
6920
Filter过滤器
1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
一个风轻云淡
2022/11/15
3000
Filter过滤器
代码审计 | Java Web 过滤器 - filter
filter 被称为过滤器,是 Servlet 2.3 新增的一个特性,同时也是 Serlvet 技术中最实用的技术。
TeamsSix
2022/09/20
4760
代码审计 | Java Web 过滤器 - filter
Filter 过滤器
1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器 2、Filter 过滤器它是 JavaEE 的规范。也就是接口 3、Filter 过滤器它的作用是: 拦截请求,过滤响应。 拦截请求常见的应用场景有: 1、权限检查 2、日记操作 3、事务管理 ……等等
愷龍
2022/10/04
7420
Filter 过滤器
Filter过滤器
过滤器 过滤器(Filter)是J2EE Servlet模块下的组件,作用是对URI进行统一拦截处理。Filter通常用于应用程序层面进行请求的前置处理 过滤链 Filter开发 开发过滤器三要素: 任何过滤器都要实现 javax.servlet.Filter 接口 在Filter接口的doFilter()方法中编写过滤器的功能代码 public class FirstFilter implements Filter { /** * 初始化 * * @param f
Breeze.
2022/07/12
5160
Filter过滤器
java过滤器怎么使用(过滤器滤纸怎么配置)
过滤器的作用:用于过滤请求,在请求发出前后,做一些检查或操作,配置及使用步骤如下:
全栈程序员站长
2022/07/28
1.3K0
java过滤器怎么使用(过滤器滤纸怎么配置)
SSH框架(三) 常用WEB框架Struts1、Struts2和Spring MVC三者的区别
SSH框架(三) 常用WEB框架Struts1、Struts2和Spring MVC三者的区别
Java架构师必看
2021/05/27
1.1K0
Java框架中常见的几个过滤器——JSP、Spring Boot、Servlet过滤器、Struts2拦截器
JSP过滤器是在JSP页面生成之前或之后执行的一种过滤器,它可以对请求进行拦截、处理和转发,还可以对响应进行修改和过滤。使用JSP过滤器可以实现很多功能,例如字符编码转换、登录验证、请求日志记录等。
秋名山码神
2023/10/16
6530
Java框架中常见的几个过滤器——JSP、Spring Boot、Servlet过滤器、Struts2拦截器
javaee的OA项目(六)过滤器的使用,解决中文乱码的过滤器和使用过滤器实现拦截判断
A、目前使用的baseServlet的优点就是方便可以进行乱码的统一的处理,但是如果我们以后不使用servlet,那么我们在进行中文乱码处理的时候就需要在每一个servlet 中去书写,但是比较麻烦。 B、在进行登陆拦截处理的时候,我们需要把拦截的代码在每一个页面中重复的书写,这样,就会变的非常的麻烦。
一写代码就开心
2021/06/17
9510
javaee的OA项目(六)过滤器的使用,解决中文乱码的过滤器和使用过滤器实现拦截判断
JavaWeb三大组件(Servlet程序、Filter过滤器、Listener监听器)
启动tomcat,浏览器访问http://localhost:8080/springmvc/servletlifecycle,控制台打印:
Java微观世界
2025/01/21
5060
JavaWeb三大组件(Servlet程序、Filter过滤器、Listener监听器)
推荐阅读
相关推荐
Java 中的 Filter 过滤器详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档