如何替换正则表达式匹配中的字符串

时间:2014-03-27 01:08:06

标签: regex delphi delphi-xe2

我正在解析包含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。

2 个答案:

答案 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

在此处试试:http://regex101.com/r/yB1mQ8