深入理解正则表达式

本文介绍了正则表达式的基本概念及应用,包括元字符、量词、懒惰限定符等核心元素,帮助读者掌握文本检索与处理的基础技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:正则表达式,对于很多人来说,一眼看去就是头皮发麻,没有什么规律可言,其实正则的所用到的字符并不是很多,主要难在于组合匹配,这个也没什么捷径可走,多练就好,前提是知道基本语法,下面介绍基本语法。

1、什么是正则表达式

正则表达式:也称为规则表达式,英文名称Regular Expression,我们在程序中经常会缩写为regex或者regexp,专门用于进行文本检索、匹配、替换等操作的一种技术。
注意:正则表达式是一种独立的技术,并不是某编程语言独有的

关于正则表达式的来历:
long long long years ago,美国新泽西州的两个人类神经系统工作者,不用干正事也能正常领工资的情况下,有段时间闲的发慌,于是他们开始研究一个课题~怎么使用数学方式来描述人类的神经网络。

这一研究,还真是搞事!另一个数学家Stephen Kleene根据他们的研究基础,通过数学算法处理,发布了《神经网事件表示法》,利用的就是正则集合的数学符号描述这个模型,正则表达式的概念进入了人们的视线。

又来了一个搞事的人~某个家伙上学学完正常的课程之后(这事在中国貌似发生不了),开始捣鼓计算机操作系统,并且搞出了现在在软件行业非常出名的系统:Unix,它就是Unix之父Ken Thompson,这个家伙也看到了那个数学家发布的论文,于是将正则表达式经过优化处理之后,引入到了Unix操作系统中专门用于文本的高效检索。

一发不可收拾,正则表达式,开始陆陆续续在各个编程语言中出现,并以它优雅的表现形式和高效的工作态度,而著名于各个语言和行业方向。

正则表达式,是一种特殊的符号,这样的符号是需要解释才能使用的,也就是需要正则表达式引擎来进行解释,目前正则表达式的引擎主要分三种:DFA,NFA、POSIX NFA,有兴趣了正则表达式引擎的,可以自己查看资料。


2、正则字符

2.1、元字符介绍
元字符描述
^边界匹配符,会匹配行或者字符串的起始位置
$边界匹配符,会匹配行或者字符串的结束位置
.匹配任意一个字符
\s匹配一个不可见字符(空格、制表符\t、换行符\n、回车符\r…)
\S匹配一个任意可见的字符
\d匹配一个数字字符,等价于[0-9]
\D匹配一个非数字字符,等价于[^0-9]
\w匹配一个数字、字母、下划线中的任意一个字符,等价于[0-9a-zA-Z_]
\W匹配一个非数字、字母、下划线中的任意一个字符,等价于[^0-9a-zA-Z_]
\b匹配一个单词的边界
\B匹配不是单词的开头或者结束的位置
2.2、量词

首先理解两个概念:
贪婪:贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,如果失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。
懒惰(非贪婪):从目标的起始位置开始匹配,如果匹配成功,就返回,不再向后匹配。

量词描述
*匹配0次或多次,默认贪婪,尽可能匹配多的
+匹配1次或多次,默认贪婪,尽可能匹配多的
匹配0或1次
{m}重复m次
{m,n}重复m至n次,默认贪婪
{m,}至少重复m次
{,n}之多重复n次
2.3、 懒惰限定符

  “*?” 重复任意次,但尽可能少重复

  “+?” 重复1次或更多次,但尽可能少重复,与上面一样,只是至少要重复1次

  “??” 重复0次或1次,但尽可能少重复

  “{n,m}?” 重复n到m次,但尽可能少重复

  “{n,}?” 重复n次以上,但尽可能少重复

3、正则进阶

捕获分组:
“(exp)” 匹配exp,并捕获文本到自动命名的组里

“(?exp)” 匹配exp,并捕获文本到名称为name的组里

“(?:exp)” 匹配exp,不捕获匹配的文本,也不给此分组分配组号

以下为零宽断言

“(?=exp)” 匹配exp前面的位置

如 “How are you doing” 正则”(?.+(?=ing))” 这里取ing前所有的字符,并定义了一个捕获分组名字为 “txt” 而”txt”这个组里的值为”How are you do”;

“(?<=exp)” 匹配exp后面的位置

如 “How are you doing” 正则”(?(?<=How).+)” 这里取”How”之后所有的字符,并定义了一个捕获分组名字为 “txt” 而”txt”这个组里的值为” are you doing”;

“(?!exp)” 匹配后面跟的不是exp的位置

如 “123abc” 正则 “\d{3}(?!\d)”匹配3位数字后非数字的结果

“(?<!exp)” 匹配前面不是exp的位置

如 “abc123 ” 正则 “(?<![0-9])123” 匹配”123”前面是非数字的结果也可写成”(?!<\d)123”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值