
正则表达式 熟能生巧
发布日期:2021-05-20 00:14:06
浏览次数:24
分类:精选文章
本文共 1779 字,大约阅读时间需要 5 分钟。
正则表达式是一种强大的工具,广泛应用于文本处理、数据验证和数据提取等多个领域. 它通过定义特定的字符模式来匹配字符串中的某些部分.
正则表达式概述
正则表达式(Regular Expression,简称regex)是一种用于文本匹配的语言-like模式表达式,主要用于判断字符串是否符合特定结构或格式. 与编程语言不同,正则表达式专门用于字符匹配,不涉及计算逻辑或算法执行.
正则表达式由两类字符组成:
- 普通字符:包括大小写字母、数字、标点符号及其他符号. 例如,a、A、0-9、!、@等.
- 元字符:是一些具有特殊含义的字符,需要用 特殊处理来 meanings. 比如
^
表示匹配字符串开头的位置,$
表示字符串末尾的位置.
正则表达式的基础元字符
在grep
、egrep
、sed
和awk
等工具中,以下是常见的正则表达式元字符及其用途:
转义字符
- 用于取消元字符的特殊含义. 例如:
\!
匹配感叹号.\n
匹配换行符.\d
匹配任意一位数字.
位置元字符
^
:匹配字符串开头的位置。例如:^a
匹配开头是字母'a'.^the
匹配以“the”开头的字符串.
$
:匹配字符串结尾的位置。例如:word$
匹配以“word”结尾的字符串.^$
匹配空字符串(即长度为0的字符串)。
匹配单字符
.
:匹配任意一个字符,除换行符外。例如:go.d
匹配“go”后跟一个字符,再后跟“d”. 例如:g..d或g\d.
重复元字符
{}
:用于规定某个子表达式的重复次数. 例如:go{d}
匹配“go”后面跟随0次或多次“d". 例如:goood
或good
.[0-9]{2,5}
匹配长度为2到5位的数字.
字符集合
[list]
:匹配list
列表中的任意一个字符。例如:[a-z]
匹配一个小写字母.[0-9]
匹配任意一位数字.
[^list]
:匹配不属于list
集合的字符。例如:[^0-9]
匹配任意非数字字符.
数量限定
{n}
:匹配前面的子表达式恰好n
次。例如:[0-9]{2}
匹配两位数字.go{2,3}
匹配“go”后跟2到3次重复的子表达式.
范围限定
{n,}
:匹配前面的子表达式至少n
次。例如:[0-9]{2,}
匹配两位及以上数字.
组合限定
{n,m}
:匹配前面的子表达式从n
次到m
次。例如:[0-9]{2,3}
匹配两位到三位数字.
需要注意的是,在egrep
和awk
中,数量限定符{n}
、{n,}
和{n,m}
不需要额外的转义字符.
正则表达式的扩展应用
在实际应用中,正则表达式可以通过组合多个元字符和子表达式来实现更复杂的匹配任务。以下是一些常见的扩展元字符:
重复与可选元字符
+
:匹配前面的子表达式至少1次。例如:aa+$
匹配“aaa”或“aaaa”结尾的字符串.
?
:匹配前面的子表达式0次或1次。例如:ab?c
匹配“abc”或“ac”.
括号与分组
()
:将括号内的内容作为一个整体进行匹配。例如:g(oo)+d
匹配“good”或“good”。
或逻辑元字符
|
:表示或的逻辑关系,用于匹配多个选项中的一个。例如:g(oo|la)d
匹配“good”或“glad”。
实际应用示例
以下是一些实际应用场景,展示正则表达式的独特优势:
获取指定格式的座机号
- 要求:座机号通常由国家代码、区号和个位数组成,格式为“XXX-XXXX-XXXX”。
- 正则表达式:
^\d{3}-\d{3}-\d{3}$
- 解释:
^\d{3}
匹配首三位数字;-\d{3}
匹配区号;-\d{3}$
匹配个位数,整个字符串从开头到结尾共有九位数字,符合座机号格式。
获取指定格式的邮箱地址
- 要求:邮箱地址一般包含用户名、域名和顶级域名,格式为“username@domain.com”。
- 正则表达式:
^([A-Za-z0-9_\-.+]+)@([A-Za-z0-9_\-.]+)\.([A-Za-z]{2,5})$
- 解释:
^([A-Za-z0-9_\-.+]+)
:匹配用户名(可包含字母、数字、符号等),且必须放在开头。@
:匹配@"的符号。([A-Za-z0-9_\-.]+)
:匹配子域名。\.([A-Za-z]{2,5})$
:匹配顶级域名(长度在2到5位之间),并且整个字符串从开头到结尾符合格式。
发表评论
最新留言
很好
[***.229.124.182]2025年04月30日 12时36分34秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java时间
2019-03-09
不编译只打包system或者vendor image命令
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
flink启动(二)
2019-03-09
pair的用法
2019-03-09
Flex 布局的自适应子项内容过长导致其被撑大问题
2019-03-09
PL/SQL 动态Sql拼接where条件
2019-03-09
【自学Flutter】4.1 Material Design字体图标的使用(icon)
2019-03-09
【换行符】什么时候用cin.get()吃掉输入流中的换行符
2019-03-09
广东外语外贸大学第三届网络安全大赛Writeup
2019-03-09
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
2019-03-10
Thymeleaf sec:authorize 标签不生效
2019-03-11
微信JS-SDK DEMO页面和示例代码
2019-03-11
Flask--简介
2019-03-11
Frame--Api框架
2019-03-11
Boostrap技能点整理之【网格系统】
2019-03-11
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2019-03-11
Git简单理解与使用
2019-03-11