正则表达式(Regular Expressions)
Completion requirements
Perl 兼容正则表达式(PCRE)
Perl 具有比 POSIX 扩展正则表达式(ERE)更丰富和更可预测的语法,其主要特点包括:
\
(反斜杠)始终用于转义非字母数字字符,避免语法混乱。- 支持贪婪(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 个字符 |
|
分组,可用 $1 , $2 等访问 |
if ("Hello" =~ m/(H..).(o..)/) 匹配 Hel 和 o W |
+ |
匹配前一个元素 1 次或多次 | if ("Hello" =~ m/l+/) 匹配 "ll" |
? |
匹配前一个元素 0 次或 1 次 | if ("Hello" =~ m/H.?e/) 匹配 He 或 Hoe |
? |
使 * 、+ 或 {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}/) 匹配 l 或 ll |
[...] |
匹配字符类 | 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/) 匹配 Hello 和 World 之间的空格 |
\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