quotemeta
是一個很好的函數,用於將具有特殊字符的精確文字轉換爲正則表達式。而\Q
and \E
是在正則表達式中做同樣事情的好運營商。
但是,你是搜索表達式並不那麼複雜。在你的編輯中,你只是在尋找一個雙引號和一個斜槓。事實上,我已經非常簡化了你的表達,所以它不包含一個反斜槓。所以這不是quotemeta
也不是\Q
and \E
的問題。
一旦削減,我沒有看到任何修改後的替代品會導致'?'的問題。在$tline
。
關鍵的簡化是,‘(’和‘)’的意思是什麼特別的你表達的更換部分,所以這相當於「」:
$tline =~ s/"\//"<%=request.getContextPath()%>\//;
且不說更容易閱讀。當然,這是更簡單:
$tline =~ s|"/|"<%=request.getContextPath()%>/|;
因爲在Perl中,你可以選擇你想與s
operator的分隔符。
但與任何這些,這個工程:
use Test::More tests => 1;
my $tline = '"/?"';
$tline =~ s|"/|"<%=request.getContextPath()%>/|;
ok($tline =~ /getContextPath/);
它通過測試。也許你遇到了一個線路上多於一個替換的問題。可固定有:
$tline =~ s|"/|"<%=request.getContextPath()%>/|g;
G是在端部的全球開關,說因爲它在輸入中發生使該取代多次。
但是,因爲我可以看到你在做什麼,我建議你要搜索的內容更加緊密規格:
$tline =~ s~\b(href|link|src)="/~$1="<%=2request.getContextPath()%>/~g;
當我運行此:
use Test::More tests => 2;
my $tline = '"/?"';
$tline =~ s/"\//"<%=request.getContextPath()%>\//;
ok($tline =~ /getContextPath/);
$tline = 'src="/?/?/beer"';
ok($tline =~ s~\b(href|link|src)="/~$1="<%=request.getContextPath()%>/~g
);
我得到兩個成功。
您的true問題尚未說明。
你究竟想要做什麼?你能給我們一個你正在使用的數據的樣本,以及你想要它成爲什麼?當你說替代品「失敗」時,你的意思是什麼? – 2010-01-25 20:52:42
您的正則表達式似乎未封閉。 'S/\ // \%/'?這是一個錯字嗎?我建議如果你的表達式中有「/」,你應該使用不同的分隔符,如:'s |/|%|'。 – slebetman 2010-01-25 20:54:28
檢查我的答案,更新引用quotemeta – 2010-01-25 21:05:35