2011-04-21 136 views
6

我有一個用%替換所有特殊字符的正則表達式(用於使用LIKE進行數據庫搜索)。它看起來像這樣:Perl正則表達式:如何替換除第一個字符以外的所有所需字符

$string =~ s/[^ a-zA-Z0-9]/%/g; 

但是我不知道如何更改表達式替換所有需要的特殊字符,除了字符串中的第一個。所以,如果我的字符串看起來像

"&Hi I'm smart(yeah right...)" 

這將是

"&Hi I%m smart%yeah right%%%%" 

(現在的首個 '&' 也取代)。

任何人都可以幫忙嗎?

回答

3

這改變了這一切,但比賽目標的第一個實例成百分比符號:

{ 
    my $count = 0; 
    $string =~ s{([^ a-zA-Z0-9])}{$count++ ? "%" : $1}ge; 
} 
3

你可以使用一個look-behind assertion需要至少一個角色:

s/(?<=.)[^ a-zA-Z0-9]/%/g; 
+0

+1好處「向後看」。 – Prix 2011-04-21 11:55:08

+1

僅當第一個字符是特殊字符時才起作用。在一般情況下,除了第一個這樣的特殊字符之外,並不能改變它們。 – tchrist 2011-04-21 14:44:42

2
substr($string, 1) =~ s/[^ a-zA-Z0-9]/%/g; 

更新:如果特殊字符是字符串的第一個字符以上纔有效。下面的作品無論在哪裏它位於:

my $re = qr/[^ a-zA-Z0-9]/; 
my @parts = split(/($re)/, $string, 2); 
$parts[2] =~ s/$re/%/g if @parts == 3; 
$string = join('', @parts); 
+0

但是如果第一個「特殊字符」不是第一個字符呢? – tchrist 2011-04-21 14:44:05

+0

@tchrist,那麼這將是一個不同的問題與不同的答案。 – ikegami 2011-04-21 15:14:07

+0

@tchrist,或者可能不是。再讀幾遍後,我和你在一起。 – ikegami 2011-04-21 15:16:55

相關問題