Delphi 正则表达式语法详解
Delphi 使用基于 PCRE (Perl Compatible Regular Expressions) 的正则表达式引擎,提供强大的文本匹配和处理能力。以下是 Delphi 正则表达式的完整语法说明:
一、基本元字符
| 元字符 |
说明 |
示例 |
. |
匹配任意单个字符(除换行符) |
a.c 匹配 "abc"、"a1c" |
^ |
匹配字符串开始位置 |
^abc 匹配以 "abc" 开头的字符串 |
$ |
匹配字符串结束位置 |
xyz$ 匹配以 "xyz" 结尾的字符串 |
\ |
转义字符 |
\. 匹配实际的点号 |
| |
或运算符 |
a|b 匹配 "a" 或 "b" |
二、字符类
| 表达式 |
说明 |
示例 |
[abc] |
匹配方括号中的任意字符 |
[aeiou] 匹配任意元音字母 |
[^abc] |
匹配不在方括号中的任意字符 |
[^0-9] 匹配非数字字符 |
[a-z] |
字符范围 |
[A-Za-z] 匹配所有字母 |
\d |
数字字符,等价于 [0-9] |
\d\d 匹配两个连续数字 |
\D |
非数字字符,等价于 [^0-9] |
|
\w |
单词字符,等价于 [A-Za-z0-9_] |
|
\W |
非单词字符,等价于 [^A-Za-z0-9_] |
|
\s |
空白字符(空格、制表符等) |
|
\S |
非空白字符 |
|
三、量词(限定符)
| 量词 |
说明 |
示例 |
* |
匹配前一个元素 0 次或多次 |
a*b 匹配 "b"、"ab"、"aab" |
+ |
匹配前一个元素 1 次或多次 |
a+b 匹配 "ab"、"aab" |
? |
匹配前一个元素 0 次或 1 次 |
colou?r 匹配 "color" 和 "colour" |
{n} |
精确匹配 n 次 |
a{3} 匹配 "aaa" |
{n,} |
匹配至少 n 次 |
a{2,} 匹配 "aa"、"aaa" 等 |
{n,m} |
匹配 n 到 m 次 |
a{2,4} 匹配 "aa"、"aaa"、"aaaa" |
四、分组与捕获
| 表达式 |
说明 |
示例 |
( ) |
捕获分组 |
(abc)+ 匹配 "abc"、"abcabc" |
(?: ) |
非捕获分组 |
(?:abc)\d 匹配 "abc1" 但不捕获 "abc" |
(?<name> ) |
命名捕获分组 |
(?<year>\d{4}) 捕获名为 "year" 的组 |
五、特殊构造
| 表达式 |
说明 |
示例 |
(?= ) |
正向肯定预查 |
Windows(?=95|98) 匹配后面是 95 或 98 的 "Windows" |
(?! ) |
正向否定预查 |
Windows(?!95|98) 匹配后面不是 95 或 98 的 "Windows" |
(?<= ) |
反向肯定预查 |
(?<=95|98)Windows 匹配前面是 95 或 98 的 "Windows" |
(?<! ) |
反向否定预查 |
(?<!95|98)Windows 匹配前面不是 95 或 98 的 "Windows" |
六、模式修饰符
| 修饰符 |
说明 |
Delphi 对应选项 |
i |
忽略大小写 |
roIgnoreCase |
m |
多行模式 |
roMultiLine |
s |
单行模式(点号匹配换行符) |
roSingleLine |
x |
忽略模式中的空白 |
需手动处理 |
在 Delphi 中通过 TRegExOptions 设置:
[roIgnoreCase, roMultiLine, roSingleLine]
七、Unicode 支持
Delphi 正则表达式完全支持 Unicode:
// 匹配中文字符
TRegEx.IsMatch('你好', '[\u4e00-\u9fa5]');
// 匹配中文标点
TRegEx.IsMatch(',。', '[\u3000-\u303f]');
八、实际应用示例
1. 邮箱验证
function IsValidEmail(const Email: string): Boolean;
begin
Result := TRegEx.IsMatch(Email,
'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');
end;
2. 提取URL
var
Matches: TMatchCollection;
begin
Matches := TRegEx.Matches('访问 https://example.com 和 http://test.com',
'https?://[^\s]+');
// 处理匹配结果...
end;
3. 复杂日期匹配
var
Match: TMatch;
begin
Match := TRegEx.Match('日期:2023-12-31',
'(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})');
if Match.Success then
begin
ShowMessage(Match.Groups['year'].Value); // 2023
ShowMessage(Match.Groups['month'].Value); // 12
ShowMessage(Match.Groups['day'].Value); // 31
end;
end;
九、性能提示
- 使用
roCompiled 选项预编译频繁使用的正则表达式
- 避免在循环中重复创建
TRegEx 对象
- 尽量使用非贪婪匹配 (
*?, +?) 提高效率
- 优先使用字符类 (
\d, \w) 而非更复杂的表达式
掌握这些语法规则后,您可以在 Delphi 中高效地实现各种复杂的文本处理需求。