从0到1:正则表达式

148 阅读4分钟

1. 概念

正则表达式是一种特殊的字符串模式,用于查找和匹配文本中的特定字符组合。它由一系列字符和特殊字符组成,用于定义匹配规则。

注:学习时可结合正则可视化界面进行理解,菜鸟正则可视化工具

2. 常用符号

符号说明示例
普通字符可以是字母、数字或标点符号。它们在正则表达式中直接匹配相同的字符abc只能匹配abc
123只能匹配123
锚定符
^前置锚点,匹配字符串的开始位置,写在字符串前面^abc:匹配abc开头的字符串,如abcxyz
$后置锚点,匹配字符串的结束位置,写在字符串后面xyz$:匹配以xyz结尾的字符串,如abcxyz
^$利用前后锚点实现模式完全匹配,非特殊需求必加,若不加则代表只要包含该模式就可匹配^abc$:匹配只包含 "abc" 的字符串,即abc
^\d{3}$:匹配只包含3个数字的字符串
^\w+$:匹配只包含一个或多个字母、数字或下划线的字符串,可匹配hello_world123,不能匹配hello world
元字符
.匹配任意单个字符ab.可匹配aba
\转义符,所有的特殊字符如果要匹配其本身都得加\\.:匹配 .
\/:匹配 /
\::匹配 :
\\:匹配 "\"
\[:匹配 [
\?:匹配 ?
\*:匹配 *
\<:匹配 <
\+:匹配 +
\d匹配任意数字(digit)ab\d可匹配ab1
\d{3}可匹配123、532等
\w匹配任意字母、数字和下划线(word),相当于[a-zA-Z0-9_]ab\w可匹配ab_
\s匹配任意空白字符,包括空格、制表符、换行符等(string)ab\s可匹配ab ab\tab\n
重复符号
*匹配前面的元素0次或多次ca*t可匹配 ctcatcaatcaaat
+匹配前面的元素1次或多次ca+t可匹配catcaatcaaat
?匹配前面的元素0次或1次ca?t可匹配ctcat
{n}匹配前面的元素恰好 n 次ca{2}t只能匹配caat
{n,}匹配前面的元素至少 n 次~ca{2,}t可匹配caatcaaat
{n,m}匹配前面的元素至少 n 次,至多 m 次ca{2,4}t只能匹配caatcaaatcaaaat
字符类
[]匹配其中的任意一个字符[abc] 可以匹配字符串中的 "a"、"b" 或 "c" 中的任意一个字符
[^]匹配除括号内的字符以外的任意字符[^abc] 可以匹配除了 "a"、"b" 和 "c" 之外的任意字符
分组符用于分组操作
()将括号内模式视为一个整体应用,从而实现整体操作,如重复、捕获、引用等(ab丨cd)*表示匹配一个或多个 "ab" 或 "cd" 的连续组合
断言符用于更灵活地指定匹配条件
\b单词边界断言\bword\b 表示匹配独立的单词 "word",而不是包含在其他单词中的部分
\B非单词边界断言\Bing\B 表示匹配字符串中任意 "ing" 出现的位置,但不匹配 "string" 中的 "ing"
(?=pattern)正向肯定前瞻断言,用于匹配满足指定模式的位置,但不消耗匹配项\d+(?=px) 匹配数字后面紧跟 "px"的字符串,如123px,不能匹配123px123
(?!pattern)正向否定前瞻断言,用于匹配不满足指定模式的位置,不消耗匹配项\d+(?!px) 匹配数字不能紧跟 "px"
(?<=pattern)反向肯定后顾断言,用于匹配位于指定模式前面的内容,不消耗匹配项(?<=@)\w+ 匹配以 "@" 开头的单词
(?<!pattern)反向否定后顾断言,用于匹配不位于指定模式前面的内容,不消耗匹配项(?<!@)\w+ 匹配不以 "@" 开头的单词
特殊用法
[a-zA-Z]匹配任意一个字母,也可以写作[A-Za-z]
[0-9]匹配任意一个数字
[a-zA-Z0-9]匹配任意一个字母或数字
.*匹配任意字符(除了换行符)零次或多次.*[a-zA-Z]:匹配零个或多个任意字符(除换行符外),后跟至少一个字母(大小写不限)

3. 编写练习

以下题目难度由低到高

  1. 匹配一个有效的日期(格式为 YYYY-MM-DD)。

    # 知识点:^$、{n}
    ^\d{4}-\d{2}-\d{2}$
    
  2. 匹配一个有效的手机号码。

    # 知识点:[]
    ^1[3456789]\d{9}$
    
  3. 匹配一个包含至少一个元音字母的单词

    # 知识点:\b
    \b\w*[aeiou]\w*\b
    
  4. 匹配一个有效的IP地址。

    # 知识点:|
    ^((([1-9]|1\d|2[0-4])?\d|25[0-5])\.){3}(([1-9]|1\d|2[0-4])?\d|25[0-5])$ 
    
  5. 匹配一个只包含数字和逗号的字符串.

    # 知识点:()
    ^\d+(,\d+)*$
    
  6. 匹配一个有效的邮箱地址。

    # 知识点 \.
    ^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$
    
  7. 匹配一个有效的密码(要求包含大小写字母、数字和特殊字符)

    # 知识点 (?=pattern)
    ^(?=.[a-zA-Z])(?=.\d)(?=.*[^a-zA-Z0-9]).{8,}$
    
  8. 匹配一个有效的URL。

    # 知识点:\/
    ^(http|https|ftp):\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*(\:[0-9]+)?(\/[^\s]*)?(\?[^\s]*)?(#[^\s]*)?$