第18周 2-正则表达式

正则表达式介绍

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. 元字符的应用示例

  1. 匹配四位整数和六位小数:

    • 需求:匹配形如 1234.567890 的数字格式。
    • 正则表达式:\d{4}\.\d{6}
    • 解释:
      • \d{4} 表示匹配四个数字。
      • \. 表示匹配一个点号(小数点)。
      • \d{6} 表示匹配六个数字。
    • 注意:小数点必须使用 \. 来匹配原义的点,否则会被误解为匹配任意字符。
  2. 匹配杭州和宁波的座机号码:

    • 需求:匹配形如 0571-123456780574-12345678 的座机号码格式。
    • 正则表达式:057[14]-\d{8}
    • 解释:
      • 057 表示前缀,固定不变。
      • [14] 表示第四位只能是 14
      • - 表示匹配原义的横杠。
      • \d{8} 表示匹配八个数字。
  3. 匹配 18 位身份证号:

    • 需求:匹配前 17 位为数字,最后一位可能为数字或字母 X 的身份证号格式。
    • 正则表达式:[1-6,8]\d{16}[0-9xX]
    • 解释:
      • [1-6,8] 表示第一位数字的范围,可以是 1-68
      • \d{16} 表示匹配接下来的 16 位数字。
      • [0-9xX] 表示最后一位可以是 0-9 的任意数字,或者 x(忽略大小写)。

4. 元字符使用中的常见错误

  • 点号(.)的误用 :
    • . 匹配任意字符,很多初学者会误以为它可以匹配小数点,实际上需要使用 \. 才能匹配普通的小数点。

定位匹配概念总结

定位匹配指的是在字符串中判断某个字符串是否以特定字符开头或结尾。在正则表达式中:

  • 上箭头 (^) 表示以特定字符开头。
  • 美元符 ($) 表示以特定字符结尾。

全字匹配

  • 使用上箭头和美元符组合,可以实现全字匹配(头尾匹配)。例如,^a.*a$ 表示字符串必须以 a 开头并以 a 结尾。

实验示例

  1. 输入原始字符串:AB AB AB AB,正则表达式:AB

    • 结果:找到四处 AB,因为正则表达式默认进行全局查找。
  2. 判断以特定字符开头:

    • 使用 ^AB.* 可以匹配以 AB 开头的字符串。
    • 如果输入 BA,则无法匹配。
  3. 判断以特定字符结尾:

    • 使用 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]+)$/
相关推荐
我码玄黄6 小时前
正则表达式优化之算法和效率优化
前端·javascript·算法·正则表达式
Java编程乐园12 小时前
Java中以某字符串开头且忽略大小写字母如何实现【正则表达式(Regex)】
java·正则表达式
好学近乎知o15 小时前
正则表达式(学习Django过程中可能涉及的)
学习·正则表达式·django
SunnyRivers2 天前
基础爬虫案例实战
正则表达式·爬虫实战·多进程·requests
西洼工作室3 天前
【java 正则表达式 笔记】
java·笔记·正则表达式
kiss strong4 天前
正则表达式
正则表达式
Linux运维技术栈4 天前
Python字符串及正则表达式(十一):正则表达式、使用re模块实现正则表达式操作
开发语言·python·正则表达式
jackiendsc4 天前
Java中正则表达式的介绍、使用场景及示例代码
java·开发语言·正则表达式
taller_20004 天前
VBA之正则表达式(48)-- 快速拆分中文语句
正则表达式·正则·拆分中文·中文拆分·中文标点
梧桐树04294 天前
python:正则表达式
数据库·python·正则表达式