Perl 兼容正则表达式(PCRE)

Perl 具有POSIX 扩展正则表达式(ERE)更丰富和更可预测的语法,其主要特点包括:

  1. \(反斜杠)始终用于转义非字母数字字符,避免语法混乱。
  2. 支持贪婪(greedy)和非贪婪(non-greedy)匹配
    • 例如,/a.*b/ 会匹配尽可能长的字符序列,而 /a.*?b/ 只会匹配尽可能短的字符序列。
    • 对于字符串 "a bad dab"
      • /a.*b/ 会匹配整个字符串 "a bad dab"
      • /a.*?b/ 只会匹配 "a b"

由于这些优点,许多其他编程语言和工具采用了类似 Perl 的正则表达式语法,包括:

  • Java
  • Ruby
  • Python
  • PHP
  • Exim(邮件服务器)
  • BBEdit(文本编辑器)
  • Microsoft .NET Framework

然而,并非所有 Perl 兼容正则表达式(PCRE) 的实现都是完全一致的,不同语言可能只支持 Perl 的部分特性。


示例

约定:

  • =~ m// 表示 匹配操作
  • =~ s/// 表示 替换操作
  • m/regex/ 等价于 /regex/m 仅在正则表达式不使用 / 作为分隔符时才需要)
  • perldoc perlre 可查阅详细文档

元字符(Metacharacters)

符号 描述 示例
. 匹配任意单个字符(除换行符) if ("Hello" =~ m/...../) 匹配至少 5 个字符
egg 分组,可用 $1, $2 等访问 if ("Hello" =~ m/(H..).(o..)/) 匹配 Helo W
+ 匹配前一个元素 1 次或多次 if ("Hello" =~ m/l+/) 匹配 "ll"
? 匹配前一个元素 0 次或 1 次 if ("Hello" =~ m/H.?e/) 匹配 HeHoe
? 使 *+{M,N} 非贪婪 if ("Hello" =~ m/(l.+?o)/) 匹配 llo 而不是 llo wo
* 匹配前一个元素 0 次或多次 if ("Hello" =~ m/el*o/) 匹配 eo, elo, ello
{M,N} 指定匹配次数范围 if ("Hello" =~ m/l{1,2}/) 匹配 lll
[...] 匹配字符类 if ("Hello" =~ m/[aeiou]+/) 匹配至少一个元音
` ` "或" 操作符
\b 匹配单词边界 if ("Hello" =~ m/llo\b/) 匹配 llo 结尾的单词
\w 匹配字母、数字、下划线 if ("Hello" =~ m/\w/) 匹配 H
\W 匹配非字母数字下划线 if ("Hello" =~ m/\W/) 匹配空格
\s 匹配空白字符(空格、制表符、换行符) if ("Hello World" =~ m/\s/) 匹配 HelloWorld 之间的空格
\S 匹配非空白字符 if ("Hello" =~ m/\S/) 匹配 H
\d 匹配数字 [0-9] if ("99 bottles" =~ m/(\d+)/) 匹配 99
\D 匹配非数字 if ("Hello" =~ m/\D/) 匹配 H
^ 匹配行首 if ("Hello" =~ m/^He/) 匹配 He 开头的行
$ 匹配行尾 if ("Hello" =~ m/rld$/) 匹配 rld 结尾的行
\A 匹配字符串开头(不匹配内部换行) if ("Hello\nWorld" =~ m/\AH/) 匹配 Hello 开头
\Z 匹配字符串结尾(不匹配内部换行) if ("Hello\nWorld" =~ m/d\n\Z/) 匹配 d\n 结尾
[^...] 匹配不在方括号内的字符 if ("Hello" =~ m/[^abc]/) 匹配 H,因为它不属于 abc

工具支持

支持 Perl 兼容正则表达式(PCRE)的工具和编程语言

  • Perl
  • Java
  • Python
  • PHP
  • Leafnode(新闻组服务器)

Perl 兼容正则表达式(PCRE)在现代编程中极为流行,因为它的强大匹配能力丰富的表达方式,被众多编程语言和工具广泛采用。

Last modified: Thursday, 30 January 2025, 2:11 AM