正则表达式入门与实战详解

178 阅读3分钟

正则表达式入门与实战详解


一、正则表达式简介

正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它由一系列字符和特殊符号组成,用于匹配、查找、替换和提取字符串中的特定模式。正则表达式广泛应用于编程语言、文本编辑器、数据库查询等领域,帮助我们高效地处理各种复杂文本问题。

二、基本元字符与符号

  1. .(点号):匹配任意单个字符(除了换行符)。

    示例:a.c 匹配 "abc"、"adc" 等。

  2. *(星号):前一个字符或表达式出现零次或多次。

    示例:a* 匹配 "", "a", "aa", "aaa" 等。

  3. +(加号):前一个字符或表达式至少出现一次。

    示例:a+ 匹配 "a", "aa", "aaa",但不匹配 ""。

  4. ?(问号):前一个字符或表达式出现零次或一次。

    示例:colou?r 匹配 "color" 和 "colour"。

  5. {n}:前一个字符或表达式精确出现n次。

    示例:ab{3} 匹配 "abbb"。

  6. {n,}:前一个字符或表达式至少出现n次。

    示例:ab{2,} 匹配 "abb", "abbbb" 等。

  7. {n,m}:前一个字符或表达式至少出现n次,最多出现m次。

    示例:ab{2,3} 匹配 "abb" 和 "abbb"。

  8. \d:匹配数字,等同于 [0-9]

  9. \w:匹配字母、数字和下划线,等同于 [a-zA-Z0-9_]

  10. \s:匹配任何空白字符,包括空格、制表符、换行符等。

三、边界匹配与分组

  1. ^:匹配输入字符串的开始位置。

    示例:^The 匹配以 "The" 开始的字符串。

  2. $:匹配输入字符串的结束位置。

    示例:end$ 匹配以 "end" 结束的字符串。

  3. ():括号用于分组,方便组合多个字符一起匹配,并可提取子串。

    示例:(\d\d)-(\d\d-\d\d) 匹配电话号码格式的字符串,如 "(12)-34-56",并且可以提取区号和号码段。

四、选择与排除

  1. |:管道符号用于表示或的关系,匹配左边或右边的表达式。

    示例:cat|dog 匹配 "cat" 或 "dog"。

  2. [^...]:匹配不在中括号内的任何字符。

    示例:[^abc] 匹配除了 "a"、"b"、"c" 之外的任意字符。

五、预置字符类与反义

  1. \D:匹配非数字字符,等同于 [^0-9]

  2. \W:匹配非单词字符,等同于 [^a-zA-Z0-9_]

  3. \S:匹配非空白字符,与\s相反。

六、量词修饰符

在某些正则引擎中,量词可以加上修饰符使其行为略有不同:

  • *?+???:懒惰量词,尽可能少地匹配。
  • {n,m}?:匹配{n,m}次,尽量少匹配。

七、实际应用举例

  • 验证电子邮件地址:^\[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • 验证手机号码(中国)1:^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$
  • 验证手机号码(中国)2:^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$
  • 提取URL链接:http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+
  • 验证电子邮件地址:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
  • 匹配纯数字:^\d+$
  • *匹配邮政编码(中国):^[1-9]\d{5}$
  • 验证身份证号(中国18位):^[1-9]\d{5}(18|19|20)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])\d{3}[\dXx]$
  • 匹配IPv4地址:^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
  • 提取HTML标签中的链接:/<a\s+(?:[^>"']|"[^"]*"|'[^']*')*\shref="([^">]+)/gi
  • 匹配日期格式(YYYY-MM-DD):^\d{4}-\d{2}-\d{2}$
  • 去除字符串两端的空格:^\s+|\s+$/g
  • 提取汉字:/[\u4e00-\u9fa5]+/
  • 匹配密码强度(至少包含大小写字母、数字,长度6-20):^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d]{6,20}$

八、总结

正则表达式虽看似复杂,但掌握其基本原理和常见模式后,将成为文本处理的强大利器。熟练运用正则表达式,能够极大地提高开发效率,简化编程任务。在具体实践中,需结合具体应用场景和正则引擎的特性灵活运用。不断练习和探索,你将逐渐领略到正则表达式的魅力所在。