正则表达式(Regular Expressions)

正则表达式(Regular Expressions, 简称 Regex)是一种用于字符串匹配和处理的强大工具,通过特定的模式(Pattern)描述字符串。它在验证、替换、分割、提取等操作中非常有效。以下是一些基本概念和常见使用场景:

  • 由于正则表达式的语法复杂,容易出现错误匹配,因此在实际使用前最好先测试验证。
  • 解决方法:利用正则调试工具(如 regex101 或 RegExr)在构建和测试正则表达式。

基本概念

  • 字符类:使用方括号 [] 定义匹配的字符范围,例如 [0-9] 匹配任意数字。
  • 预定义字符
    • \d:匹配数字 [0-9]
    • \w:匹配字母、数字或下划线 [A-Za-z0-9_]
    • \s:匹配空白字符(空格、制表符等)
  • 量词:指定匹配次数。
    • *:匹配前一个字符 0 次或多次
    • +:匹配前一个字符 1 次或多次
    • ?:匹配前一个字符 0 次或 1 次
    • {n}:匹配前一个字符恰好 n 次
    • {n, m}:匹配前一个字符 n 至 m 次
  • 定位符:用于指定匹配位置。
    • ^:匹配字符串的开头
    • $:匹配字符串的结尾
  • 分组与引用
    • ():用于分组
    • |:表示“或”操作
    • \1\2等:用于引用之前的分组

常见应用场景

  • 验证输入格式:正则可用于校验字符串的格式,如验证电子邮件、手机号、邮政编码等。例如,^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$ 可用来验证邮箱格式。
  • 搜索和替换:可根据正则模式查找匹配内容并替换。例如,在字符串中替换所有空格可以使用 \s+
  • 提取信息:常用于从文本中提取特定数据(如 URL、日期、时间等)。例如,匹配日期 \d{4}-\d{2}-\d{2} 可以用来提取格式为 yyyy-mm-dd 的日期。

以下是常用正则表达式符号和校验规则的表格介绍,方便查阅和快速了解正则表达式的作用及其常见用途:

正则符号作用示例解释
.匹配任意单个字符a.c匹配 “abc”、“adc” 等
^匹配字符串的开头^Hello匹配以 “Hello” 开头的字符串
$匹配字符串的结尾world$匹配以 “world” 结尾的字符串
*匹配前一个字符 0 次或多次a*匹配 0 个或多个 “a”
+匹配前一个字符 1 次或多次a+匹配 1 个或多个 “a”
?匹配前一个字符 0 次或 1 次a?匹配 0 个或 1 个 “a”
{n}匹配前一个字符恰好 n 次a{3}匹配 3 个连续的 “a”
{n, m}匹配前一个字符 n 到 m 次a{1,3}匹配 1 到 3 个 “a”
[]匹配字符集中的任意一个字符[abc]匹配 “a”、“b” 或 “c”
[^]匹配不在字符集中的字符[^abc]匹配除 “a”、“b”、“c” 外的字符
\d匹配数字 [0-9]\d{3}匹配任意 3 位数字
\w匹配字母、数字或下划线\w+匹配任意长度的单词
\s匹配空白字符\s+匹配 1 个或多个空白字符
``或运算符`a
()分组(ab)+匹配 “ab” 一次或多次
\b单词边界\bword\b匹配整个单词 “word”

常用校验规则

校验项正则表达式解释
手机号(大陆)^1[3-9]\d{9}$匹配以 “1” 开头的 11 位大陆手机号
邮箱地址^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$匹配邮箱格式(如 example@domain.com
身份证号(中国)`^\d{15}\d{18}$`
邮政编码(中国)^[1-9]\d{5}$匹配 6 位的中国邮政编码
URL^https?://[^\s/$.?#].[^\s]*$匹配 URL,支持 http 和 https
IPv4 地址`^(25[0-5]2[0-4]\d
日期(yyyy-mm-dd)^\d{4}-\d{2}-\d{2}$匹配 “2024-10-31” 格式的日期
车牌号(中国)^[京津沪渝辽川鄂…]\w{5}$匹配中国车牌号
简单密码(6-12 位)^[\w!@#$%^&*]{6,12}$匹配 6 到 12 位的简单密码

1. 避免贪婪匹配

  • 默认情况下,*+? 等量词是贪婪的,会匹配尽可能多的字符。例如,<.*> 会匹配字符串中的第一个 < 到最后一个 >
  • 解决方法:可以在量词后加 ?,如 <.*?>,表示非贪婪模式,匹配最少的字符。

2. 正则表达式的性能

  • 复杂的正则表达式在长字符串上可能会降低性能,甚至引发回溯导致的性能瓶颈。例如大量分组、重复匹配等会造成正则的效率下降。
  • 解决方法:尽量优化正则结构,避免使用过多的嵌套和不必要的分组。若可能,考虑其他方案处理。

3. 字符转义

  • 正则中很多符号有特殊含义(如 .*?+[] 等),直接使用这些符号可能导致错误匹配。
  • 解决方法:如需匹配这些特殊字符,前面加上 \ 转义,例如 \. 可以匹配一个句点字符。

4. 正确处理 Unicode 和多字节字符

  • 在处理中文、日文、韩文(CJK 字符)和 emoji 等 Unicode 字符时,普通的 \w\d 等可能无法正常匹配。
  • 解决方法:使用 Unicode 支持的正则语法(如 JavaScript 中的 \p{}u 标志)。例如 /\p{Script=Han}/u 用于匹配中文字符。

5. 验证输入格式和正则安全

  • 用户输入的正则表达式可能会导致安全问题,尤其在允许用户自定义输入时,可能会形成“正则注入”。
  • 解决方法:严格限制正则表达式的输入,或考虑其他方法避免将用户输入直接用于正则匹配。

6. 使用锚点避免全局匹配错误

  • ^$ 用于匹配字符串的开头和结尾,适当使用这些锚点可以提高匹配精度。例如,匹配整串手机号应使用 ^1[3-9]\d{9}$,而不是仅使用 1[3-9]\d{9}
  • 解决方法:根据需求选择合适的锚点,避免意外的部分匹配。

7. 正则表达式的可读性

  • 复杂的正则表达式可读性差,维护困难,尤其是多行嵌套的正则表达式,容易产生错误。
  • 解决方法:将正则拆分为多个部分,并适当添加注释。可以在编程语言中使用“正则构建器”工具或将复杂正则拆分成多个简单表达式。

8. 避免不必要的分组

  • () 会产生分组,便于捕获匹配的内容;但过多分组会影响效率,也可能导致意外的捕获。
  • 解决方法:若不需要捕获内容,可使用非捕获分组 (?:...),它不会影响捕获组的顺序。

9. 使用合适的标志

  • 标志(flags)如 gim 在不同环境中会影响匹配行为。
    • g:全局匹配
    • i:忽略大小写
    • m:多行匹配
  • 解决方法:根据需求添加合适的标志,不使用时最好省略,以免引入不必要的复杂性。

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

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

相关文章

文件夹无法访问?全面解析与高效恢复策略

一、文件夹无法访问的困境 在日常的计算机使用中&#xff0c;我们时常会遇到文件夹无法访问的尴尬情况。这种故障表现为双击文件夹时&#xff0c;系统毫无反应&#xff0c;或者弹出“无法访问&#xff0c;拒绝访问”的错误提示。更令人头疼的是&#xff0c;有时文件夹内的文件…

设计模式 策略模式 场景Vue (技术提升)

策略模式 (建议复制编辑器查看更佳) 在给定的 Vue.js 组件代码中&#xff0c;根据optionKey的不同值&#xff0c;展示了不同的表单内容并定义了不同的表单验证规则。在这里&#xff0c;optionMap对象内部定义了不同的策略&#xff08;addAccount、editAccount、editPassword&am…

万字长文详解Hive聚合函数 grouping sets、cube、rollup原理、语法、案例和优化

目录 原理与语法 使用场景 多维度报表生成 复杂的数据分析 实际案例 原理与语法 与GROUPINGSETS的区别 实际案例 原理与语法 与CUBE的对比 实际案例 执行效率比较 优化建议 Hive提供了三个强大的高级聚合函数: GROUPING SETS 、 CUBE 和 ROLLUP ,用于处理复杂的…

长短期记忆网络(LSTM)如何在连续的时间步骤中处理信息

长短期记忆网络&#xff08;LSTM&#xff09;如何在连续的时间步骤中处理信息 长短期记忆网络&#xff08;LSTM&#xff09;是一种高级的循环神经网络&#xff08;RNN&#xff09;&#xff0c;设计用来解决传统RNN在处理长时间序列数据时遇到的梯度消失或爆炸问题。LSTM通过其…

Spring @RequestMapping 注解

文章目录 Spring RequestMapping 注解一、引言二、RequestMapping注解基础1、基本用法2、处理多个URI 三、高级用法1、处理HTTP方法2、参数和消息头处理 四、总结 Spring RequestMapping 注解 一、引言 在Spring框架中&#xff0c;RequestMapping 注解是构建Web应用程序时不可…

飞牛OS在Docker中安装ODOO ERP系统

从后台的Docker镜像库安装一直报错误&#xff0c;无法安装成功&#xff0c;使用以下命令进入OS系统&#xff0c;以下是执行脚本: Start a PostgreSQL server $ docker run -d -e POSTGRES_USERodoo -e POSTGRES_PASSWORDodoo -e POSTGRES_DBpostgres --name db postgres:15 S…

cookie、session、http简单理解

Cookie:以key-value键值对的形式存储一些文本信息数据 并将数据保存在客户端(浏览器) sessionid&#xff08;身份&#xff09; 数据库中有一个seesion表&#xff0c;存放着所有的Session数据&#xff0c; 而sessionid就对应数据库数据这个id&#xff0c;服务器找到对应id的Ses…

VLAN间通信以及ospf配置

目录 1.基础知识介绍 1.1 什么是VLAN&#xff1f; 1.2 VLAN有什么用&#xff1f; 1.3 不同VLAN如何实现通信&#xff1f; 1.4 什么是路由汇总&#xff1f; 1.4.1 路由汇总的好处&#xff1a; 2. 实验 2.1 网络拓扑设计 2.2 实验配置要求 2.2.1 三层交换配置&#xff…

Redis的数据结构

一、Redis概述 Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。与MySQL数据库不同的是&a…

十四届蓝桥杯STEMA考试Python真题试卷第二套第一题

来源&#xff1a;十四届蓝桥杯STEMA考试Python真题试卷第二套编程第一题 题目描述&#xff1a; 给定一个字符串&#xff0c;输出字符串中最后一个字符。 输入描述&#xff1a; 输入一个字符串 输出描述&#xff1a; 输出字符串中最后一个字符 样例输入&#xff1a; hgf 样…

Spring Boot 注解大全:全面解析 Spring Boot 常用注解及其应用场景

Spring Boot 注解大全:全面解析 Spring Boot 常用注解及其应用场景 简介 Spring Boot 是一个基于 Spring 框架的简化开发框架,它旨在简化 Spring 应用的初始搭建和开发过程。Spring Boot 提供了一系列的注解,使得开发者可以更加方便地进行应用开发和配置。本文将详细介绍 S…

C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(4)

8.1、实现分区 在模块接口分区文件中不需要声明分区&#xff0c;也可以在模块实现分区文件中进行声明&#xff0c;在一个以.cpp为扩展名的正常源代码文件中&#xff0c;在这种情况下&#xff0c;它是一个实现分区&#xff0c;有时候叫内部分区。这样的分区无法导出&#xff0c;…

随着 AI 技术的不断发展,AI大模型正随着 AI 技术的不断发展,AI大模型正

随着 AI 技术的不断发展&#xff0c;AI大模型正在重塑软件开发流程&#xff0c;从代码自动生成到智能测试&#xff0c;未来&#xff0c;AI 大模型将会对软件开发者、企业&#xff0c;以及整个产业链都产生深远的影响。欢迎与我们一起&#xff0c;从 AI 大模型的定义、应用场景、…

数组对象常用方法合集

1、运算扩展符 ES6通过扩展元素符<font style"color:rgb(71, 101, 130);">...</font>&#xff0c;好比 <font style"color:rgb(71, 101, 130);">rest</font> 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 conso…

MATLAB基础应用精讲-【数模应用】平均绝对误差损失 Mean Absolute Error Loss(附python、R语言和MATLAB代码实现)

目录 前言 几个高频面试题目 RMSE与MAE对比 平均绝对误差和均方误差(L1&L2)比较 MAE与MSE的性质对比 2.1 敏感度 2.2 单位与解释 2.3 数学特性 优缺点分析 3.1 MAE的优缺点 3.2 MSE的优缺点 应用场景 4.1 MAE的应用 4.2 MSE的应用 均方根误差和平均绝对误差的…

SQL Server身份验证模式

SQL Server是一个广泛使用的关系数据库管理系统&#xff0c;通常使用两种身份验证模式&#xff1a;Windows身份验证和SQL Server身份验证。理解这些身份验证方式的概念与更改方式的操作&#xff0c;对于数据库管理员和开发者至关重要。本文将详细介绍身份验证方式的概念以及如何…

基于Spring Boot的信息学科平台系统开发指南

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于保密信息学科平台系统的相关信息成为必…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要&#xff1a;本文涵盖了GIS软件操作的多方面内容&#xff0c;包括地图文档的新建、打开、保存及版本兼容性处理&#xff1b;错误与警告的查阅及帮助文档的使用技巧&#xff1b;地图打印比例尺的调整与地图信息的完善&#xff1b;图层操作的撤销与恢复&#xff0c;界面元素的…

从零开始的c++之旅——继承

1. 继承 1.继承概念及定义 继承是面向对象编程的三大特点之一&#xff0c;它使得我们可以在原有类特性的基础之上&#xff0c;增加方法 和属性&#xff0c;这样产生的新的类&#xff0c;称为派生类。 继承 呈现了⾯向对象程序设计的层次结构&#xff0c;以前我们接触的…

【学习】软件测试中V模型、W模型、螺旋模型三者介绍

在软件工程的星辰大海之中&#xff0c;存在着三种独特的航路图&#xff1a;V模型、W模型以及螺旋模型。它们分别以各自的方式描绘了软件开发与测试的不同旅程。 首先映入眼帘的是V模型——一个以垂直线条贯穿始终的简洁图形。这个模型如同一座倒立的“V”字形山峰&#xff0c;…