正则表达式介绍
1. 什么是正则表达式?
正则表达式(Regular Expression)是一种用于匹配、查找和替换字符串的表达式。它是一种规则的描述语言,用于定义字符串的模式。正则表达式广泛应用于各种主流编程语言中,如 C、Java、.NET、JavaScript 等,能够高效地进行字符串的验证、查找和替换等操作。
2. 正则表达式的应用场景
- 字符串校验:验证输入的格式是否符合预期,例如检查一个字符串是否符合邮箱格式、电话号码格式等。
- 字符串查找:在文本中搜索符合特定模式的字符串,如查找所有以 "http" 开头的链接。
- 字符串替换:替换符合特定模式的字符串,如将文本中的所有空格替换为逗号。
元字符
1. 元字符的定义
元字符是指在正则表达式中用于匹配特定字符类型的特殊字符。它们通过特定的符号表示一类字符,而不是单个字符,具有特殊的含义。
2. 常用元字符介绍
\d
: 匹配任意一个数字字符(0-9
)。\D
: 匹配任意一个非数字字符,与\d
相反。\w
: 匹配任意一个字母、数字或下划线字符(a-z
,A-Z
,0-9
,_
)。\W
: 匹配任意一个非字母、非数字、非下划线的字符,与\w
相反。\s
: 匹配任意一个空白字符(空格、制表符、换行符等)。\S
: 匹配任意一个非空白字符,与\s
相反。.
: 匹配任意一个字符(不包括换行符)。\.
: 匹配一个普通的点号(.
),表示原义输出。
3. 元字符的应用示例
-
匹配四位整数和六位小数:
- 需求:匹配形如
1234.567890
的数字格式。 - 正则表达式:
\d{4}\.\d{6}
- 解释:
\d{4}
表示匹配四个数字。\.
表示匹配一个点号(小数点)。\d{6}
表示匹配六个数字。
- 注意:小数点必须使用
\.
来匹配原义的点,否则会被误解为匹配任意字符。
- 需求:匹配形如
-
匹配杭州和宁波的座机号码:
- 需求:匹配形如
0571-12345678
和0574-12345678
的座机号码格式。 - 正则表达式:
057[14]-\d{8}
- 解释:
057
表示前缀,固定不变。[14]
表示第四位只能是1
或4
。-
表示匹配原义的横杠。\d{8}
表示匹配八个数字。
- 需求:匹配形如
-
匹配 18 位身份证号:
- 需求:匹配前 17 位为数字,最后一位可能为数字或字母
X
的身份证号格式。 - 正则表达式:
[1-6,8]\d{16}[0-9xX]
- 解释:
[1-6,8]
表示第一位数字的范围,可以是1-6
或8
。\d{16}
表示匹配接下来的 16 位数字。[0-9xX]
表示最后一位可以是0-9
的任意数字,或者x
(忽略大小写)。
- 需求:匹配前 17 位为数字,最后一位可能为数字或字母
4. 元字符使用中的常见错误
- 点号(
.
)的误用 :.
匹配任意字符,很多初学者会误以为它可以匹配小数点,实际上需要使用\.
才能匹配普通的小数点。
定位匹配概念总结
定位匹配指的是在字符串中判断某个字符串是否以特定字符开头或结尾。在正则表达式中:
- 上箭头 (
^
) 表示以特定字符开头。 - 美元符 (
$
) 表示以特定字符结尾。
全字匹配
- 使用上箭头和美元符组合,可以实现全字匹配(头尾匹配)。例如,
^a.*a$
表示字符串必须以a
开头并以a
结尾。
实验示例
-
输入原始字符串:
AB AB AB AB
,正则表达式:AB
。- 结果:找到四处
AB
,因为正则表达式默认进行全局查找。
- 结果:找到四处
-
判断以特定字符开头:
- 使用
^AB.*
可以匹配以AB
开头的字符串。 - 如果输入
BA
,则无法匹配。
- 使用
-
判断以特定字符结尾:
- 使用
AB$
可以匹配以AB
结尾的字符串。 - 如果输入
BA
,则无法匹配。
- 使用
贪婪模式、非贪婪模式与表达式分组总结
贪婪模式
贪婪模式是指在满足条件的情况下,尽可能多地匹配字符串。在正则表达式中,这是默认匹配行为。例如,对于字符串 111222333和正则表达式
/d{6,8}/,贪婪模式会匹配到八个字符,结果为
11122233`。
非贪婪模式
非贪婪模式(懒惰模式)是指在满足条件的情况下,尽可能少地匹配字符串。在正则表达式中,添加问号(?
)后,匹配将采用非贪婪模式。例如,对于字符串 111222333
,使用正则表达式 /d{6,8}?/
会匹配到六个字符,结果为 111222
。
实际应用
在实际项目中,贪婪模式可能导致匹配过多字符。例如,提取超链接中的网址时
表达式分组概念总结
什么是表达式分组
表达式分组是将一个完整的正则表达式分成多个子表达式的方式,使用小括号将子表达式包裹起来,使得子表达式可以作为整体进行匹配。
表达式分组的应用
1. 匹配验证码
- 四位验证码 :使用
/^\d{4}$/
匹配。 - 六位验证码 :错误地使用
/^\d{4,6}$/
会匹配到五位,正确方式是使用分组:/(^\d{4}$)|(^\d{6}$)/
。
2. 匹配车牌号
- 车牌号由区域汉字和五位数字或字母组成,使用分组来清晰表达:
- 区域部分用
[黑][辽][京]
等表示。 - 车牌部分使用
[A-Z0-9]{5}
表示。 - 完整表达式示例:
/^([黑辽京][A-Z])-([A-Z0-9]{5})$/
。
- 区域部分用
3. 匹配中文或英文姓名
- 英文姓名 :可以使用
/^[A-Z][a-z]+/s[A-Z][a-z]+$/
匹配。 - 中文姓名 :使用 Unicode 匹配,示例:
- 中文范围:
\u4E00-\u9FA5
。 - 完整表达式示例:
/^([\u4E00-\u9FA5]{2,8}|[A-Z][a-z]+ [A-Z][a-z]+)$/
。
- 中文范围: