Delphi 正则表达式语法详解

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;

九、性能提示

  1. 使用 roCompiled 选项预编译频繁使用的正则表达式
  2. 避免在循环中重复创建 TRegEx 对象
  3. 尽量使用非贪婪匹配 (*?, +?) 提高效率
  4. 优先使用字符类 (\d, \w) 而非更复杂的表达式

掌握这些语法规则后,您可以在 Delphi 中高效地实现各种复杂的文本处理需求。

posted @ 2025-05-06 19:25  月如无恨月长圆  阅读(204)  评论(0)    收藏  举报