我有相同数量的行列表(多行文本字符串)的N次出现(项目在许多方面和线路的数量可能会有所不同的顺序可能不过):找到匹配线
Ardei
Mere
Pere
Ardei
Castraveti
我想找到2日发生匹配线的包含“Ardei”和另一个正则表达式用另一个名字替换项目的名称,并单独找1日发生“Ardei”和替代名称与别的东西(perl)。
我有相同数量的行列表(多行文本字符串)的N次出现(项目在许多方面和线路的数量可能会有所不同的顺序可能不过):找到匹配线
Ardei
Mere
Pere
Ardei
Castraveti
我想找到2日发生匹配线的包含“Ardei”和另一个正则表达式用另一个名字替换项目的名称,并单独找1日发生“Ardei”和替代名称与别的东西(perl)。
假设您想用"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
Ardei[\W\w]*?(Ardei)
将与它的\ 1完全匹配第二个“Ardei”,因此您可以使用它来精确地替换第二个实例。
不,这会在包含至少2个“Ardei”的字符串中找到最后一个“Ardei”。 –
是的,我忘记了regexps的贪婪,现在纠正我的解决方案! –
你为什么想用正则表达式来做到这一点?谁在向你提出这项要求? –
你在用什么语言? JavaScript,C#,PHP等...都有不同的正则表达式特征/限制。 –
我已格式化文本 - 现在这是否正确?那是“列表”多行文本字符串?该“列表”中是否可以有多于三行?可以有多个比赛吗?您需要更准确地指定规则 - 请编辑您的问题并提供一些详细信息。 –