我有相同數量的行列表(多行文本字符串)的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等...都有不同的正則表達式特徵/限制。 –
我已格式化文本 - 現在這是否正確?那是「列表」多行文本字符串?該「列表」中是否可以有多於三行?可以有多個比賽嗎?您需要更準確地指定規則 - 請編輯您的問題並提供一些詳細信息。 –