2013-07-31 31 views
1

我没有我的代码在家里,但我意识到我需要做一个正则表达式替换一个特定的表达式,我想知道是否有一个最佳做法。替换第一个正则表达式的每一个匹配项,除了第一个?

什么,目前我的代码做的是寻找在文件中的比赛,采取这些匹配出文件(有""代替),然后一旦所有文件都处理我做的.NET Process类调​​用做一些命令行的东西。具体来说,我将要做的是将一组文件复制到一个最终输出文件中(合并)。但每一个地方要合并的文件具有完全相同的第一线的情况下,这让我们只说对的例子是:

FIRST_NAME|MIDDLE_NAME|LAST_NAME|ADDRESS 

现在,具有第一个文件是好的。而且我认为我将要进行最终匹配,并在文件合并后进行替换。但我只想在第一次出现之后替换特定表达式的匹配。

所以,我读了C#拥有精湛的支持正则表达式向后看?这是否是实现“在第一次匹配之后替换匹配”的正确方法?如果是的话,您将如何实现它给定一个示例正则表达式?

我个人的解决方案,这是与Directory.GetFiles返回该文件夹中的文件的数量,然后在我的foreach (string file in matches)我将宣布一个快速的状态,说

if (count == directoryCount) 
do not match and replace 
count minus 1 
elseif (count < directoryCount) 
strip matching expression 

,然后每次迭代通过foreach后第一次运行将从文件中去除匹配的表达式,只保留具有我想保留的表达式的第一个文件。

谢谢你的任何建议。

+0

我想过编写合并步骤来跳过每个文件栏的第一行,首先会比合并文件更高效,然后必须将整个合并文件吸引到一个大字符串中,以便能够运行一个正则表达式。 –

+0

@Damien_The_Unbeliever而不是使用目录计数我只是在之前设置了一个布尔值,然后在第一遍中将其更改为false,以便通过foreach的下一次运行将取出该行。然后,在处理完所有文件之后,我执行一个正则表达式。使用空行标识符替换multiLine属性的空行块。 –

回答

0

Regex.Replace有几个重载提供MatchEvaluator evaluator,这是代表Match返回替换String

所以,你可以使用类似re.Replace(input, m => first ? (first=false, m.Value) : "")(但我有一个VB程序员,并在把这个没有任何语法检查)。

1

怎么样使用replaceFirst()备份第一occurency,并与一些字符标记它。然后再次使用replaceAll()replaceFirst()来回滚第一场比赛。

相关问题