找到匹配线的第N次出现

时间:2011-09-08 17:43:28

标签: regex

我有相同行数的列表(多行文本字符串)(项目的顺序可能在很多方面有所不同,但行数可能不同):

Ardei
Mere
Pere
Ardei
Castraveti

我想找到包含“ Ardei ”的匹配行的第2次,并将项目名称替换为其他名称,并在另一个正则表达式中单独找到<强烈>第一次出现' Ardei '并用其他名称替换名称(perl)。

2 个答案:

答案 0 :(得分:1)

假设您要将{ nd "Ardei"替换为"XYZ"。你可以这样做(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

答案 1 :(得分:0)

Ardei[\W\w]*?(Ardei)

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