我正在解析包含IP地址和端口的文本文件。 IP地址和端口组合由一个或多个TAB或SPACE或两者分隔。
文本文件中出现的样本如下:
121.78.195.165 8888
我需要匹配整个文本并将每个匹配返回到用"替换的TAB或空格:"所以它返回:
121.78.195.165:8888
如果通过嵌入SPACE或TAB返回匹配,这将很容易,但有时会返回没有SPACE或TAB的匹配。有时只有一个空间。
例如。有时像这样:
121.78.195.1658888
和其他人一样:
121.78.195.165 8888
上述变化取决于源文本中是否存在SPACE,TAB或两者的组合以及多少。
我在Delphi中使用TPerlRegex就像这样:
regex := TPerlRegEx.Create;
try
regex.Options := [preMultiLine];
regex.regex :=
'\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[\s\t]+\d{2,5}\b';
regex.Study;
regex.Subject := StringOf(buf);
if regex.Match then
begin
regex.Replacement := ':';
s := regex.MatchedText; // <---- Need this to be '121.78.195.165:8888'
ShowMessage(s);
end;
finally
regex.Free;
end;
所以我的问题更多的是关于如何使用Regex引擎来替换IP地址之后和端口之前出现的TAB或SPACE。
TIA。
答案 0 :(得分:3)
您可以使用类似的内容(针对XE2 TPerlRegEx兼容性编辑):
var
Regex: TPerlRegEx;
ResultString: string;
begin
Regex := TPerlRegEx.Create;
try
Regex.RegEx := '\b((?:[0-9]{1,3}\.){3}[0-9]{1,3})\s(.*)';
Regex.Options := [];
Regex.State := [preNotEmpty];
Regex.Subject := SubjectString;
Regex.Replacement := '\1:\2';
Regex.ReplaceAll;
ResultString := Regex.Subject;
finally
Regex.Free;
end;
end;
使用以下值进行测试:
85.39.138.58 151
187.39.55.23 399
80.14.5.209 1424
80.14.6.217 1424
1.1.135.73 1464
80.14.5.209 135
80.14.7.2 1392
187.39.55.100 399
67.78.18.222 1472
结果:
85.39.138.58:151
187.39.55.23:399
80.14.5.209:1424
80.14.6.217:1424
1.1.135.73:1464
80.14.5.209:135
80.14.7.2:1392
187.39.55.100:399
67.78.18.222:1472
答案 1 :(得分:0)
如果我理解你,这个替换应该有效:
找到:\b((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?:[\s\t:]*)(\d{2,5})\b
替换为:$1:$2