2011-09-08 146 views
1

我有相同数量的行列表(多行文本字符串)的N次出现(项目在许多方面和线路的数量可能会有所不同的顺序可能不过):找到匹配线

Ardei 
Mere 
Pere 
Ardei 
Castraveti 

我想找到2日发生匹配线的包含“Ardei”和另一个正则表达式用另一个名字替换项目的名称,并单独找1日发生“Ardei”和替代名称与别的东西(perl)。

+3

你为什么想用正则表达式来做到这一点?谁在向你提出这项要求? –

+2

你在用什么语言? JavaScript,C#,PHP等...都有不同的正则表达式特征/限制。 –

+0

我已格式化文本 - 现在这是否正确?那是“列表”多行文本字符串?该“列表”中是否可以有多于三行?可以有多个比赛吗?您需要更准确地指定规则 - 请编辑您的问题并提供一些详细信息。 –

回答

1

假设您想用"XYZ"替换2 "Ardei"。你可以是这样做的(PCRE语法):

^(?s)(.*?Ardei.*?)Ardei 

,取而代之的是:

$1XYZ 

$1包含在(.*?Ardei.*?)捕捉一切与(?s)将导致.真的每场比赛字符(也是换行符)。

小演示:

#!/usr/bin/perl -w 

my $text = 'Ardei 
Mere 
Pere 
Ardei 
Castraveti 
Ardei'; 

$text =~ s/^(?s)(.*?Ardei.*?)Ardei/$1XYZ/; 
# or just: $text =~ s/^(.*?Ardei.*?)Ardei/$1XYZ/s; 

print $text; 

会打印:

Ardei 
Mere 
Pere 
XYZ 
Castraveti 
Ardei
0
Ardei[\W\w]*?(Ardei) 

将与它的\ 1完全匹配第二个“Ardei”,因此您可以使用它来精确地替换第二个实例。

+0

不,这会在包含至少2个“Ardei”的字符串中找到最后一个“Ardei”。 –

+0

是的,我忘记了regexps的贪婪,现在纠正我的解决方案! –