Pcre使用小记(三)自定义替换

部署运行你感兴趣的模型镜像

Pcre使用小记(三)自定义替换

Pcre有个函数是function Replace(const Input : string;const Replacement  : string):来实现替换功能,
但是这个函数并不能完成我们所有的需求。我们都知道大多数情况下,使用Pcre匹配到的都是不定内容(如果你
一定要它匹配某个字符,算我没说,那还不如直接使用Pos),对于匹配到的内容进行替换,当然可以使用上面的
函数进行固定替换。但是我们更希望根据匹配到的内容进行一种可以定义替换结果的替换方法,我下面以匹配[A-Za-z]
所有英文字母进行首字母大写转换作为示例:

我们使用以下函数:
function TRegex.Replace(const Input: string; Evaluator: TRegexMatchEvaluator; MatchOptions  : TRegMatchOptions): string;
其中TRegexMatchEvaluator是个返回String结果的函数,声明为:TRegexMatchEvaluator = function(theMatch: IMatch): string
我们看下这个替换函数的函数体:
function TRegex.Replace(const Input: string; Evaluator: TRegexMatchEvaluator; MatchOptions  : TRegMatchOptions): string;
var
  theOffset     : Integer;
  theToken      : string;
  theMatch      : IMatch;
  firstPosition : Integer;
  lastPosition  : Integer;

begin
  if not Assigned(Evaluator) then
  begin
    Result := Input;
    Exit;
  end;

  Result        := '';
  theOffset     := 0;
  firstPosition := 0;
  theMatch      := Match(Input, theOffset, MatchOptions);

  while theMatch.Matched do
  begin
    lastPosition    := theMatch.Index;
    theToken        := System.Copy(Input, firstPosition + 1, lastPosition - firstPosition);

    if Length(theToken) <> 0 then
      Result := Result + theToken;

    Result          := Result + Evaluator(theMatch);
    firstPosition   := theMatch.Index + theMatch.Length;
    theOffset       := Max(firstPosition, theMatch.Index + 1);
    theMatch        := Match(Input, theOffset, MatchOptions);
  end;

  theToken := System.Copy(Input, firstPosition + 1, MaxInt);

  if Length(theToken) <> 0 then
    Result := Result + theToken;
end;


那么我们的自定义替换其实就是给这个函数传个自己实现的TRegexMatchEvaluator而已

function ConvertCase(theMatch: IMatch): AnsiString;
begin
   Result := theMatch.Groups[0].Value;
   Result := AnsiTitleCase(Result);//实现首字母大写功能
end;

function textConvertCaseByfow(const S:AnsiString):AnsiString;
const
  thePattern = '[a-zA-Z]+';
var
 Regex: IRegex;
begin
  Result:=S;
  Regex := RegexCreate(thePattern);
  Result :Regex.Replace(Result,ConvertCase,[]);
end;
 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值