Delphi 正则表达式

目录

  1. 基本用法
  2. 转义字符
  3. 边界
  4. 临界匹配
  5. 匹配模式选项

 

安装步骤:Delphi 正则表达式起步

基本用法:

with reg do 
begin
  Subject:= str; //要进行操作的字符串        
  RegEx  := str1; //要被替换的子字符串
  Replacement := str2; //被替换成的字符串
     // (str1=>str2)
  ReplaceAll;//执行替换
     str:= Subject; //取回替换后的字符串。
end
//属性:preCaseLess 不区分大小写
reg.Options := [preCaseLess];

注意:不区分大小写后,中文替换会出现错误(中文也不区分了……)

//|:或者
reg.RegEx   := 'e|Delphi|0'; //将e、Delphi、0替换成想要的字符串

//+:重复一个或多个
reg.RegEx   := 'ab+'; //将ab、abb、abbb等替换,最大替换原则

//*:重复0个或多个
reg.RegEx   := 'ab*'; //将a、ab、abb、abbb等替换,最大替换原则

//?重复 0 个或 1 个
reg.RegEx   := 'ab?'; //将a、ab替换,ab优先。

//{}大括号
//{num}:指定重复num次
//{num1, num2}:重复num1~num2次
//{num,}:重复num次或以上
//[ ]匹配范围,将与方括号中想匹配的“字符”匹配
//可以是:[a-z]、[A-Z]、[0-9]、[fajdl;gkhalu]
//[^ ]不匹配范围,与匹配相反

注意:[ ]只用来匹配单个字符

转义字符

//转义字符

// d 匹配所有数字, 相当于 [0-9]
// D 匹配所有非数字, 相当于 [^0-9]

// w 匹配字母、数字与下划线_, 相当于 [A-Za-z0-9_]
// W 匹配非字母、数字与下划线_, 相当于 [^A-Za-z0-9_]

// s 匹配任何空白, 包括空格、制表、换页等, 相当于 [f

	v]
// S 匹配任何非空白, 相当于 [^f

	v]

// x 匹配十六进制的 ASCII
// . 匹配除换行符以外的任何字符

{
  f : 换页符
  
 : 换行符
  
 : 回车符
  	 : 制表符(Tab)
  v : 垂直制表符
}

 边界:

//  单词边界
  reg.Subject := 'Delphi Delphi2007 MyDelphi'; 
  reg.RegEx   := 'Delphi'; //前后边界
  reg.Replacement := '';
  reg.ReplaceAll;
//结果为“◆ Delphi2007 MyDelphi”


  reg.RegEx   := 'Delphi'; //左边界
//结果为“◆ ◆2007 MyDelphi”

reg.RegEx   := 'Delphi'; //右边界
//结果为“◆ Delphi2007 My◆”


// B 非单词边界

// ^ 行首
  reg.RegEx   := '^Del'; //匹配在行首的 Del
//返回: ◆phi Delphi2007 MyDelphi

// A 也标记行首
  reg.RegEx   := 'ADel'; //匹配在行首的 Del
//返回: ◆phi Delphi2007 MyDelphi


// $ 行尾
  reg.RegEx   := 'phi$'; //匹配在行尾的 phi
//返回: Delphi Delphi2007 MyDel◆

//  也标记行尾
  reg.RegEx   := 'phi'; //匹配在行尾的 phi
//返回: Delphi Delphi2007 MyDel◆
//正规表达式一般默认为贪婪匹配
//默认规则1.从最左边开始匹配
//默认规则2.在符合要求的情况下尽量匹配到最右边(符合1的前提下匹配最长的串)

  reg.Subject := '<html><head><title>标题</title></head><body>内容</body></html>';
  reg.RegEx   := '<.*>'; //将会全部匹配, 因为两头分别是: < 和 >
  reg.Replacement := '';
//贪婪匹配,结果为“◆”

  reg.Subject := '<html><head><title>标题</title></head><body>内容</body></html>';
  reg.RegEx   := '<.*?>'; // *? 是非贪婪匹配方法之一, 将匹配每组 <>
  reg.Replacement := '';
//非贪婪匹配,结果为“◆◆◆标题◆◆◆内容◆◆”

//区别是加了个问号。

 引用子表达式

//1. 子表达式要用“( )”括起
//2. 从左到右依次为123……按左括号排序,包括嵌套的字表达式
//3. 0 表示整个表达式

  reg.Subject := 'one two three ten';
  reg.RegEx   := '(t)(w+)';
  reg.Replacement := '[1-2:]'; // 12 分别引用对应的子表达式; 0 引用整个表达式
//结果: one [t-wo:two] [t-hree:three] [t-en:ten]

临界匹配

//(?=xxx) 匹配到xxx之前的位置
//(?<=xxx)匹配到xxx之后的位置
//把上面的“=”改为“!”,不匹配原来得到的结果

  reg.Subject := 'Delphi 6; Delphi 7; Delphi 2007; Delphi Net';
  reg.RegEx   := 'Delphi (?=2007)'; // ?=
  reg.Replacement := '';
 //结果: Delphi 6; Delphi 7; ◆2007; Delphi Net


  reg.Subject := '111, 222, ¥333, ¥444';
  reg.RegEx   := '(?<=¥)d{3}'; // ?<=
  reg.Replacement := '';
  reg.ReplaceAll;
//结果: 111, 222, ¥◆, ¥◆

  reg.Subject := '111, 222, ¥333, ¥444';
  reg.RegEx   := '(?<!¥)d{3}'; // ?<!
  reg.Replacement := '';
//结果: ◆, ◆, ¥333, ¥444

匹配的选项

// preCaseLess: 不区分大小写, 相当于其他语言中的 i
// preAnchored: 只匹配字符串开始, 相当于 ^, 不过还是有区别的
// preDollarEndOnly: 让 $ 只匹配字符串结尾
// preMultiLine: 多行匹配, 相当于其他语言中的 m
// preSingleLine: 让特殊符号 . 能够匹配换行符 (. 的本意是匹配换行符以外的任意字符)
// preUnGreedy: 指定为非贪婪模式
// preExtended: 指定为扩展模式

//抄自:万一的博客http://www.cnblogs.com/del/archive/2007/12/21/1009363.html
原文地址:https://www.cnblogs.com/laymond/p/3394543.html