【计算机基础】正则表达式 Regular Exprssion (RE/regex)

正则表达式(Regular Expression, RE)用于匹配和检索文本,常见于各种编程语言中。本文介绍了如何匹配任意字符、设置重复次数及指定范围等基本操作,并通过实例解释了其在文本编辑器、网页表单验证等方面的应用。" 87829315,7708813,Python中列表、字典及对象排序技巧,"['Python编程', '数据结构', '排序算法']

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

正则表达式

又称 规则表达式Regular Expression,常简写为regex、regexp或RE
正则表达式是计算机科学的一个概念。
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。(用来匹配字符串/文字)

  • “正则"就是"规则”,"正则表达式"就是能够让我们表达出自己想法的规则,只要学会了这种规则,我们就能够表达自己的想法。

白话:
大家都知,command+F可以在文本内容内搜索对应的文本;
若文本"hello"出现了三次,分别在第一行,第二行和最后一行,搜索结果被匹配了3此,搜索目的达到。
但,如果我想搜索“位于首行的文本”,不想获取到其他行的文本;也就是说,字符串不仅要是"hello",而且还要位于行首,需要同时满足这两个条件的字符串才算满足条件。如何处理?
Regular Expression可以帮助告诉计算机,只查找"位于行首的hello字符串"
————————————————————————
例如Sublime Text中有此功能的实现:
注:.*就是Regular Expression的功能钮;通过搜索正则表达式^hello匹配到了首行的hello
在这里插入图片描述

举几个日常见到的例子:
淘宝网注册账号,输入手机时,输入数字不满11位时,会有提示框出现“手机号码格式不正确,请重输”;
这就是系统运用正则表达式,来发现错误的典型例子。

发微博时:文本框添加表情,出现的是文本(如[难过]),发送后却成为了GIF图片;这也是正则运用后的结果。

正则是所有编程语言都会用到的工具,语法都大同小异。及其重要。
————————————————————————

匹配任意字符: / 字符 / g

注:以下练习用✔︎表示此行被Expression匹配到了;

建议使用在线练习网站:RegExr.com

//g
匹配字符
—————————————
注意!(汉字集合下面有说到)
匹配纯汉字时可直接写汉字,如匹配“汉字”:/ 汉字 /g
匹配汉字集合时要写汉字的Unicode,如匹配“啦 - 啦”:/ [\u4e00 - \u9fa5] /g

/字 ../g
点代表匹配(除了断行/空行外)任意一个字符;
(亦可写成:/ 字符 ... /g / .. 字符 /g,一个点代表一个字符)

————————————————————————————————
Expression:
/ 菠萝 .. /g
————————————————————————————————
Text:
菠萝油    ✔︎
菠萝果茶  ✔︎
菠什么萝
————————————————————————————————
————————————————————————————————
Expression:
/ . /g
————————————————————————————————
Text:
菠萝油    ✔︎
菠萝果茶  ✔︎
菠什么萝  ✔︎
————————————————————————————————
————————————————————————————————
Expression:
/ . /g
————————————————————————————————
Text:
                  若这里全为断行
                  NO MATCH

————————————————————————————————
————————————————————————————————
Expression:
/ .... /g
————————————————————————————————
Text:
abc               因Expression是4个点,Test内只有3个字符
                  NO MATCH

————————————————————————————————
————————————————————————————————
Expression:
/ 3.14 /g
————————————————————————————————
Text:
3.14   ✔︎      
2.18                   
4.14
3-14   ✔︎      因为“点”代表任意字符,也包括“-”
————————————————————————————————

若我们不想让“点”代表任何字符,想明确匹配“点”?
“点”前加 斜杠(转义符)\.(注意:是delete键下方的斜杠键);

————————————————————————————————
Expression:
/ 3\.14 /g
————————————————————————————————
Text:
3.14   ✔︎      
2.18                   
4.14
3-14          此行不再被匹配
————————————————————————————————

/\w/g (小写 w)
匹配阿拉伯数字英文大小写还有下划线(数字和字母以外只支持下划线);

————————————————————————————————
Expression:
/ \w /g
————————————————————————————————
Text:
1234567890      ✔︎
abcdefg         ✔︎
hijklmnopqrst   ✔︎
_               ✔︎
「」#¥*!@()
————————————————————————————————

/\W/g (大写 W)
匹配被小写w排除在外的字符(\w的补集);

————————————————————————————————
Expression:
/ \w /g
————————————————————————————————
Text:
1234567890    
abcdefg       
hijklmnopqrst  
_            
「」#¥*!@()   ✔︎
————————————————————————————————

/\d/g (小写 d)
匹配阿拉伯数字

————————————————————————————————
Expression:
/ \d /g
————————————————————————————————
Text:
1.2345.67890    ✔︎(其中两个“点”未被匹配)
abcdefg       
hijklmnopqrst  
_            
「」#¥*!@()
————————————————————————————————
————————————————————————————————
Expression:
/ \d\.\d /g
————————————————————————————————
Text:
1.2      ✔︎
————————————————————————————————

/\D/g (大写d)
匹配非阿拉伯数字的字符,包括空格(\d的补集);

————————————————————————————————
Expression:
/ \D /g
————————————————————————————————
Text:
1.2345.67890    ✔︎(只匹配到两个“点”)
ab cd efg       ✔︎
hijklmnopqrst   ✔︎
_               ✔︎
————————————————————————————————

/\s/g (小写 s)
匹配所有空白字符:空格、tab、断行等

————————————————————————————————
Expression:
/ \s /g
————————————————————————————————
Text:
	1 234 67890   ✔︎(只匹配到其中的空格和tab)
abcdefg       
hijklmnopqrst  
_            
「」#¥*!@()
————————————————————————————————

/\S/g (大写 S)
匹配所有空白字符(空格、tab、断行等)以外的字符;

/[12345]/g 或者 /[1 - 5]/g

————————————————————————————————
Expression:
/ [1 - 5] /g
————————————————————————————————
Text:
ABCDEFGHIJK
aaabbbccc 
1234567890   ✔︎(匹配到12345)  
_            
「」#¥*!@()
————————————————————————————————

/[abcdef]/g 或者 /[a - f]/g (集合:小写字母可匹配到 小写+大写

————————————————————————————————
Expression:
/ [a-f] /g
————————————————————————————————
Text:
ABCDEFGHIJK   ✔︎(匹配到ABCDEF)  
aaabbbccc     ✔︎(匹配到aaabbbccc)   
1234567890
_            
「」#¥*!@()
————————————————————————————————

/[ABCDEF]/g 或者 /[A - F]/g(集合:大写字母只可匹配到 大写

————————————————————————————————
Expression:
/ [A-F] /g
————————————————————————————————
Text:
ABCDEFGHIJK   ✔︎(匹配到ABCDEF)  
aaabbbccc       
1234567890
_            
「」#¥*!@()
————————————————————————————————

/[\u4e00 - \u9fa5]/g (汉字集合\uUnicode 万国码,用数字(16进制)代表文字的一项标准);

注意!
匹配纯汉字时可直接写汉字,如匹配“汉字”:/ 汉字 /g
匹配汉字集合时要写汉字的Unicode,如匹配“啦 - 啦”:/ [\u4e00 - \u9fa5] /g

其实0x4e00代表199680x9fa5代表40869某个很复杂的汉字,这个区间代表Unicode中所有的汉字。(40869-19968 = 20901 记录在Unicode中的汉字有20901个)
graphemica.com Unicode 在线转换网站

————————————————————————————————
Expression:
/[\u4e00 - \u9fa5]/g
————————————————————————————————
Text:
ABCDEFGHIJK    
aaabbbccc       
1234567890
啦啦啦        ✔︎
—————————————————————————————————

——————————————————————————————————

重复一次或多次

此部分就像做饭过程中的调料,前部分是主食;调料也会起到重要作用。

若老板想让你在评论区匹配“yo”
评论区有正确语法的“yo”,也有“yooooooo”
如何同时匹配这些相同意思的文本?

/[字]+ /g ( 加号 置于字符/集合 后面 表示前一个字符可以出现一次或多次

————————————————————————————————
Expression:
/ yo+ /g
————————————————————————————————
Text:
yo      ✔︎
yoooo   ✔︎
————————————————————————————————

如何同时匹配yoYo?(首字母小写和大写
/[yY]o+ /g (表示yY的集合)
———————————————
如何同时匹配yoYO?(全部小写和全部大写
/[yY][oO]+ /g (表示yoYO的集合)
注: 这样也可以匹配YOOOOOOOOOO
———————————————
不要低估用户的创造能力
若出现yo!!! yo!!~~~ Yo。。。。。,如何匹配到?

[字]*星号置于字符/集合后面:表示此部分可以出现0次或多次

/[yY] [oO] + [!~\.]*/g
(除了匹配y和Y,o和O,还跟个符号集合! ~ ,此符号合集可以出现0次或多次
(字符框内代表一个字符)

————————————————————————————————
Expression:
/ [yY]  [oO] + [!~\.]* /g  (若此式没有*号,YOOOOO行前面的3行都不能被匹配)
————————————————————————————————
Text:
yo       ✔︎
yooo     ✔︎
Yo       ✔︎
YOOOOOOO ✔︎
yo~~~~~  ✔︎
yo....   ✔︎
yo!~...  ✔︎
————————————————————————————————

[字]? 问号置于字符/集合后面:表示此部分可以出现0次或1次

若想新增范围为yop,同时也保留p后的标点符号,如yop!!~~,如何处理?

/[yY] [oO] + p?[!~\.]*/g

————————————————————————————————
Expression:
/ [yY]  [oO] + p?[!~\.]* /g  (符号集合前加了个"p?":"p"可出现0次或1次)
————————————————————————————————
Text:
yo       ✔︎
yooo     ✔︎
Yo       ✔︎
YOOOOOOO ✔︎
yo~~~~~  ✔︎
yo....   ✔︎
yo!~...  ✔︎
yop      ✔︎     新增yop
YOP~~~~  ✔︎     新增YOP~~~~
————————————————————————————————

——————————————————————————————————

指定重复范围

前面说的+ ? * 范围都太笼统,若想指定选择yoooooooy7o),可否实现?

{ }花括号可以指定选择重复范围

若想选择o出现2次 - 4次的行?

/yo {2,4}/g

————————————————————————————————
Expression:
/ yo{2,4} /g
————————————————————————————————
Text:
yo 
yoo       ✔︎
yooo      ✔︎
yoooo     ✔︎
yooooooo  ✔︎  (此处只匹配到第1到第4个o,后面的o未被匹配)
————————————————————————————————

问题来了,老板看到最尾行yooooooo只有部分被匹配,不想要这一行;
什么方法可以把这行排除在外?

最直接的方法:字符/集合后添加\bBoundary:产生边界)
如:/yo {2,4}\b/g

————————————————————————————————
Expression:
/ yo{2,4}\b /g
————————————————————————————————
Text:
yo 
yoo       ✔︎
yooo      ✔︎
yoooo     ✔︎
yooooooo
————————————————————————————————
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值