2011-09-08 109 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的貪婪,現在糾正我的解決方案! –