学习Regex:一篇搞定核心概念与常用技巧 – wiki词典

Regex:一篇搞定核心概念与常用技巧

正则表达式(Regular Expression,简称Regex)是计算机科学中一个强大的工具,用于在文本中查找、匹配和操作符合特定模式的字符串。无论你是开发者、数据分析师还是系统管理员,掌握Regex都将极大地提升你处理文本的效率。本文将从核心概念讲起,带你一步步掌握Regex的常用技巧。

核心概念

1. 字面量 (Literal Characters)

最基本的正则表达式就是由普通字符组成的。例如,cat这个表达式会匹配文本中出现的”cat”这个单词。

2. 元字符 (Metacharacters)

元字符是Regex中具有特殊含义的字符,它们是构建复杂模式的关键。

  • . (点): 匹配除换行符以外的任何单个字符。
  • \ (反斜杠): 转义字符,用于将元字符转换为字面量,或将普通字符转换为特殊含义。例如,\.匹配真正的点.,而\d则有特殊含义。

3. 字符类 (Character Classes)

字符类定义了一组可以匹配的字符。

  • [ ] (方括号): 匹配方括号中包含的任意一个字符。例如,[abc]可以匹配 “a”、”b” 或 “c”。
  • [^ ] (否定方括号): 匹配任何包含在方括号中的字符。例如,[^abc]可以匹配除了”a”、”b”、”c”之外的任何字符。
  • - (范围): 在方括号内,连字符可以表示一个范围。例如,[a-z]匹配所有小写字母,[0-9]匹配所有数字。

预定义字符类

为了方便,Regex提供了一些预定义的字符类:

  • \d: 匹配任何数字,等同于 [0-9]
  • \D: 匹配任何非数字字符。
  • \w: 匹配任何单词字符(字母、数字、下划线),等同于 [a-zA-Z0-9_]
  • \W: 匹配任何非单词字符。
  • \s: 匹配任何空白字符(空格、制表符、换行符等)。
  • \S: 匹配任何非空白字符。

4. 量词 (Quantifiers)

量词用于指定前面的元素(字符、字符类或组)必须出现的次数。

  • *: 匹配零次或多次。
  • +: 匹配一次或多次。
  • ?: 匹配零次或一次。
  • {n}: 匹配确定的 n 次。
  • {n,}: 匹配至少 n 次。
  • {n,m}: 匹配 nm 次。

贪婪与非贪婪匹配 (Greedy vs. Lazy)

默认情况下,量词是“贪婪的”,它们会尽可能多地匹配文本。在量词后加上?可以使其变为“非贪婪”或“懒惰”模式,即尽可能少地匹配。

  • *?: 匹配零次或多次,但尽可能少地匹配。
  • +?: 匹配一次或多次,但尽可能少地匹配。

5. 锚点 (Anchors)

锚点用于匹配字符串中的特定位置,而不是字符本身。

  • ^: 匹配字符串的开头。
  • $: 匹配字符串的结尾。
  • \b: 匹配单词边界。单词边界是指单词字符和非单词字符之间的位置。
  • \B: 匹配非单词边界。

6. 分组与交替 (Grouping and Alternation)

  • ( ) (圆括号): 用于将多个元素组合成一个单元(一个组)。量词可以应用于整个组。分组也用于“捕获”匹配的子字符串,以便后续引用。
  • (?: ): 非捕获组,用于分组但不创建捕获。
  • | (管道符): 表示“或”,匹配|两侧的任意一个表达式。例如,cat|dog可以匹配 “cat” 或 “dog”。

常用技巧与实例

1. 输入验证

Regex在表单验证中非常有用,可以确保用户输入的数据格式正确。

验证邮箱地址

一个相对简单的邮箱验证Regex:

regex
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

  • ^...$: 确保整个字符串都符合模式。
  • [a-zA-Z0-9._%+-]+: 匹配用户名部分。
  • @: 匹配 “@” 符号。
  • [a-zA-Z0-9.-]+: 匹配域名部分。
  • \.[a-zA-Z]{2,}: 匹配顶级域名(如 .com, .net等)。

验证电话号码 (中国)

regex
^1[3-9]\d{9}$

  • ^1: 以 “1” 开头。
  • [3-9]: 第二位是 3 到 9 的数字。
  • \d{9}: 后面跟着9个数字。

2. 查找与替换

使用Regex可以轻松地查找和替换文本。

示例: 将所有Markdown标题(如 # 标题)替换为HTML的 <h1> 标签。

  • 查找: ^# (.*)$
  • 替换: <h1>$1</h1>

这里的 $1 是一个反向引用(backreference),它指向第一个捕获组 (.*) 匹配到的内容(即标题文本)。

3. 数据提取

从大段文本中提取特定信息是Regex的另一个强大应用。

示例: 从HTML代码中提取所有链接的URL。

html
<a href="https://example.com">Link 1</a>
<a href="http://test.org/page">Link 2</a>

可以使用以下Regex来提取 href 属性的值:

regex
href="([^"]*)"

  • href=": 匹配字面量 href="
  • ([^"]*): 捕获一个组,该组包含零个或多个非 " 的字符。这就是我们想要的URL。
  • ": 匹配结束的双引号。

结语

正则表达式是一个功能极其丰富的工具,初学时可能会觉得有些复杂。但通过理解其核心概念,并从简单的模式开始实践,你会慢慢发现它的强大之处。希望本文能为你打开Regex世界的大门,让你在处理文本时更加得心应手。建议使用在线Regex测试工具(如 regex101.com)来练习和调试你的表达式。

滚动至顶部