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 中高效地实现各种复杂的文本处理需求。