正则表达式?How to do?

正则表达式

正则表达式(Regular Expressions,简称regex或regexp)是一种强大的文本处理工具,用于匹配、查找、替换字符串中的特定模式。

详细文档 在线调试工具

基础概念

  • 模式(Pattern):正则表达式本身就是一个模式,用于描述一系列可能的字符串。
  • 匹配(Match):当一个字符串符合正则表达式的模式时,我们说这个字符串与该模式匹配。
  • 元字符(Metacharacters):具有特殊意义的字符,例如.*+?等。
  • 转义(Escaping):使用反斜杠\来取消元字符的特殊意义,使它们作为普通字符参与匹配。

常见元字符及其功能

字面字符
  • 字面字符是最简单的正则表达式元素,直接代表自己。例如,a 仅匹配字母 a
元字符
  • 元字符是具有特殊意义的字符,用来构造复杂的匹配模式。
    • .:匹配除换行符外的任何单个字符。
    • ^:匹配字符串的开始位置。如:^a 匹配以 a 开始的字符串
    • $:匹配字符串的结束位置。如,a$ 匹配以 a 结束的字符串
    • *:匹配前面的表达式零次或多次。如:ab*c,表示 匹配 ac、abc、abbc 等,即 a 后跟零个或多个 b,再跟c。
    • +:匹配前面的表达式一次或多次。如:ab+c,表示 匹配 abc、abbc 等,即 a 后跟一个或多个 b,再跟 c。
    • ?:匹配前面的表达式零次或一次。如:ab?c,表示 匹配 ac 或 abc,即 a 后跟零个或一个 b,再跟 c.
    • {n}:匹配前面的表达式恰好 n 次。
    • {n,}:匹配前面的表达式至少 n 次。
    • {n,m}:匹配前面的表达式至少 n 次,但不超过 m 次。如a{2,4}, 表示匹配两到四个连续的 a。
      示例
    • []:定义一个字符集,匹配括号内的任何一个字符。
    • [^...]:定义一个否定字符集,匹配不在括号内的任何字符。
    • ():创建一个捕获组,可以用来引用组内的内容。如:(ab)c,表示匹配 abc,并将 ab 作为一个组捕获。
    • |:逻辑或,表示选择前面或后面的一个表达式。如:ab|cd,表示匹配 ab 或者 cd
    • \:转义字符,用来转义后续的特殊字符。如:\.,表示匹配点号 .(因为 . 是元字符,需要用 \ 转义)
字符类
  • 字符类是预定义的字符集,简化了常见字符集的书写。
    • \d:匹配任何数字,等价于 [0-9]
    • \D:匹配任何非数字,等价于 [^0-9]
    • \s:匹配任何空白字符,包括空格、制表符、换页符等。如:\s+,表示匹配一个或多个空白字符(空格、制表符、换行符等)
    • \S:匹配任何非空白字符。
    • \w:匹配任何字母数字字符,包括下划线 _,等价于 [a-zA-Z0-9_]
    • \W:匹配任何非字母数字字符,等价于 [^a-zA-Z0-9_]
    • \b:匹配单词边界。
    • \B:匹配非单词边界。
模式修饰符
  • 修饰符用来改变正则表达式的匹配行为。
    • i:忽略大小写。
    • g:全局匹配(不只匹配第一次出现)。
    • m:多行匹配,使 ^$ 能够匹配每一行的开始和结束。
    • u:Unicode 模式,在支持 Unicode 的环境中启用 Unicode 字符类。
    • y:粘附模式,从上次匹配结束的地方开始匹配。
其他
  • (?:pattern): 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。
    • 例如,industr(?:y|ies) 是比 industry|industries更经济的表达式。
  • (?=pattern):执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。
    • 例如,‘Windows (?=95|98|NT|2000)’ 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
  • (?!pattern):执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。
    • 例如,‘Windows (?!95|98|NT|2000)’ 匹配"Windows 3.1"中的 “Windows”,但不匹配"Windows 2000"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

实例及解析

匹配电子邮件地址
^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
  • ^:确保电子邮件地址位于字符串的开始。
  • [a-zA-Z0-9_.+-]+:匹配一个或多个用户名部分的字符。
  • @:匹配 @ 符号。
  • [a-zA-Z0-9-]+:匹配一个或多个域名部分的字符。
  • \.:匹配点号 .
  • [a-zA-Z0-9-.]+:匹配顶级域名部分。
  • $:确保电子邮件地址位于字符串的末尾。
匹配手机号码
^\+?1?\d{9,15}$
  • ^:确保号码位于字符串的开始。
  • \+?:可选的加号 +
  • 1?:可选的前缀 1
  • \d{9,15}:匹配 9 到 15 位数字。
  • $:确保号码位于字符串的末尾。
匹配日期格式
\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])
  • \d{4}:匹配四位数字(年份)。
  • -:匹配短横线 -
  • (0[1-9]|1[012]):匹配月份,范围从 01 到 12。
  • (0[1-9]|[12][0-9]|3[01]):匹配天数,范围从 01 到 31。

常用案例

  • 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$
  • 英文字母:^[A-Za-z]+$
  • 汉字:^[\u4e00-\u9fa5]{0,}$
  • 邮箱:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  • url:[a-zA-z]+://[^\s]* ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  • 手机号码:^1[35789]\d{9}$
  • 校验IP-v4地址:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
  • 校验IP-v6地址:(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
  • 身份证号码18位:^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$

使用场景

  • 验证输入:如电子邮件地址、电话号码格式等。
  • 搜索和替换:在文档中查找特定模式的文本,并进行替换。
  • 数据提取:从大量文本中提取有用信息,如日期、价格等。
  • 文本清理:去除不需要的字符或格式化文本。

注意事项

  • 性能问题:复杂的正则表达式可能会导致性能下降,尤其是在处理大数据集时。
  • 安全性:不当的正则表达式使用可能导致安全漏洞,如拒绝服务攻击。
  • 测试:在实际应用之前,应该充分测试正则表达式以确保其正确性和鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值