假设我有一个字符串
myString := 'aa12bb23cc34dd'
我想用数字的值乘以2来代替每次出现的数字(我的实际应用会更复杂,这是示例):
myUpdatedString := 'aa24bb46cc68dd'
我知道Regexpr的ReplaceRegExpr可以像Sed一样使用,但它不将函数作为要应用于匹配元素的参数。
目前,我正在做这样的事情(可能有点难看/无效,但是重要的是做事的方式):
program Project1;
uses
SysUtils, RegExpr;
// The function I would like to call on my matched element
function foo(const x: integer): integer;
begin
result = x * 2;
end;
function bar(const base, s: string): string;
var
pos: integer;
s2: string;
begin
// Application of foo
s2 := foo(StrToInt(s)).ToString;
// Substitution of the matched string
result = StringReplace(base, s, s2);
end;
var
re: TRegExpr;
myString, myUpdatedString: string;
begin
myString := 'aa12bb23cc34dd';
re := TRegExpr.Create('[0-9]+');
if re.Exec(myString) then
begin
// For each matched elements
myUpdatedString := bar(myString , re.Match[1]);
while re.ExecNext do
begin
myUpdatedString := bar(myString , re.Match[1]);
end;
end;
re.Free;
end.
难道没有更轻松或更优雅的方式吗?
像ReplaceRegExpr这样的函数将函数作为参数应用到匹配的元素将是最好的,但我找不到任何函数。
感谢您的帮助!
编辑:在我的实际应用中,我不需要替换数字,而是替换HTML流的各种标记中的属性值。我想从各种标签中修改各种元素,这些值需要大量计算才能知道用什么替换。我认为这对于一个简单的问题来说是很多信息。
TRegExpr
已经自带了.Replace()
,并.ReplaceEx()
给你交出的形式的函数TRegExprWReplaceFunction
被调用的每个匹配的次数。在此,您可以确定结果,然后将其用作比赛的替代。这样,您就可以自定义它了。例:
type
TDum= class // Must be a function of object, hence a helper class
class function MyReplace( re: TRegExpr ): String;
end;
class function TDum.MyReplace( re: TRegExpr ): String;
begin
// Example: convert matching text to number, double it, convert back to text
result:= IntToStr( StrToInt( re.Match[1] )* 2 );
end;
...
myUpdatedString:= re.Replace( 'aa12bb23cc34dd', TDum.MyReplace );
// Should have become 'aa24bb46cc68dd'
如果你看一下TRegExp的来源,你会看到,这些方法都非常相似,你有什么构造.Exec()
和.ExecNext()
了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句