2014-03-27 213 views
2

我正在解析包含IP地址和端口的文本文件。 IP地址和端口组合用一个或多个TAB或SPACE或两者分开。如何替换正则表达式中的字符串匹配

样品在文本文件中出现的是这样的:

121.78.195.165 8888

我需要匹配这一整个文本,并与TAB(S)或返回每场比赛SPACE(S)替换为 “:” 使其返回此:

121.78.195.165:8888

如果匹配是以SPACE或TAB嵌入的方式返回的,那么这会很容易,但是有时候没有SPACE或TAB会返回匹配。有时候只有一个空间。

例如。有时候是这样的:

121.78.195.1658888

和其他人是这样的:

121.78.195.165 8888

上面的变化取决于是否有空格,TAB或两者的组合以及源文本中的数量。

我使用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; 

所以我的问题是有关如何使用正则表达式引擎做更换后出现的TAB(S)或用空间(S)的IP地址和端口之前。

TIA。

+0

你怎么知道如果121.78.195.1658888是121.78.195.16:58888或121.78.195.165:8888? –

回答

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 
+0

你是这样做的:TRegex.Replace?它不适用于我(Delphi XE2) –

+0

在我的过程声明部分中,声明了正则表达式作为:正则表达式:TPerlRegEx; –

+0

对不起。你错过了你使用TPerlRegEx;我用'TRegEx' [文档在这里](http://docwiki.embarcadero.com/Libraries/XE5/en/System.RegularExpressions.TRegEx),它具有'TRegEx.Replace'。你的代码并不表示你使用的是任何特定版本的Delphi - 如果你有版本特定的需求,你应该在你的问题中包含一个特定于版本的标签XE5的'TPerlRegEx。替换'记录在[这里](http://docwiki.embarcadero.com/Libraries/XE5/en/System.RegularExpressionsCore.TPerlRegEx.Replace) –

0

如果我理解你,这应该更换工作:

查找内容:$1:$2

尝试在这里:\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

替换为http://regex101.com/r/yB1mQ8

+0

我确认它也适用于@ KenWhite的输入。 – aliteralmind

+0

我不明白你的意思:用$ 1替换:$ 2 –

+0

这与@ KenWhite的答案中的'\ 1:\ 2'相当。虽然我不熟悉德尔福,但在很多正则表达式中,它们是可以互换的。 – aliteralmind