2010-08-09 174 views

回答

16
my($substr) = $string =~ /.*x(.*)/; 

從的perldoc perlre:

默認情況下,量化的子模式是「貪婪」,也就是說,它將匹配 多次地(給定一個特定的起始位置),而 仍允許其餘的模式匹配。

這就是爲什麼.*x將匹配高達x的最後一次出現。

7

最簡單的方法是使用/([^x]*)$/

5

第一個答案是好的,但 談「的東西,不包含」當... 我喜歡用「匹配」正則表達式它

my($substr) = $string =~ /.*x([^x]*)$/;

在某些情況下非常有用

+0

+1確實非常有用 – 2010-08-09 10:53:28

+1

您不需要正則表達式中的前導'。* x'。 – runrig 2010-08-09 18:00:32

+0

這是正確的,謝謝,但這是爲了說明「doeas不包含x的東西」 – benzebuth 2010-08-10 07:48:24

1

正則表達式/([^x]+)$/#assuming x is not last element of the string.

2

最簡單的方法不是正則表達式,而是一個簡單的split()並獲取最後一個元素。

$string="axxxghdfx445"; 
@s = split /x/ , $string; 
print $s[-1]; 
+0

真的值得創建一個臨時數組嗎? 'print(split/x /,$ string)[ - 1];'也可以。 – Zaid 2010-08-09 11:04:58

+0

取決於對嗎?如果我想使用其他元素呢? – ghostdog74 2010-08-09 11:51:21

3

另一種方式來做到這一點。它不像單個正則表達式那麼簡單,但是如果您爲速度進行優化,則此方法可能比使用正則表達式的任何方法都快,其中包括split

my $s  = 'axxxghdfx445'; 
my $p  = rindex $s, 'x'; 
my $match = $p < 0 ? undef : substr($s, $p + 1); 
3

我很驚訝沒有人提到的特殊變量,這樣做,$':「$'」返回匹配的字符串之後的一切。 (perldoc perlre

my $str = 'axxxghdfx445'; 
$str =~ /x/; 

# $' contains '445'; 
print $'; 

但是,是有成本的(重點煤礦):

警告:一旦Perl中看到你需要的$ &一個 「$ ", or "$'" anywhere in the program, it has to provide them for every pattern match. This may substantially slow your program. Perl uses the same mechanism to produce $1, $2, etc, so you also pay a price for each pattern that contains capturing parentheses. (To avoid this cost while retaining the grouping behaviour, use the extended regular expression "(?: ...)" instead.) But if you never use $&, "$」 或 「$」「,那麼沒有 捕捉括號的模式將不會受到處罰。 因此,如果可以的話,儘量避免使用$ &,「$'」和 「$`」,但如果你不能(和一些算法真的 欣賞它們),一旦你使用過一次,因爲 你已經支付了價格。截至5.005,$ &不像其他兩個 昂貴。

但是等等,還有更多!你會得到兩個運營商的價格,立即行動!

作爲這個問題一個解決方法,Perl的5.10.0介紹 「$ {^預匹配}」, 「$ {^ MATCH}」 和 「$ {^ POSTMATCH}」,這是等效 到「$ `「,$ &和」$'「,只不過它們只能保證是在與」/ p「 (保留)修飾符執行的成功匹配之後定義的 。使用這些變量不會導致全局性能損失,不像它們的標點符號char等價物,但是 在折衷時必須告訴perl何時使用它們。

my $str = 'axxxghdfx445'; 
$str =~ /x/p; 

# ${^POSTMATCH} contains '445'; 
print ${^POSTMATCH}; 

我會虛心提交這條路線是在大多數情況下,最好的,最直接的 方法,因爲它不要求你做特別的事情 與你的模式建設,以獲取postmatch部分,並且 沒有性能損失。

+1

除非您正在捕捉「x」的第一個出現,而不是最後一個。 – runrig 2010-08-09 18:03:28

+0

@runrig:哈哈,這樣會讓我的整篇論文脫軌:)事實上,在這種特殊情況下,'/ x([^ x] *)$ /'會更好......我太習慣於描述'$' ',其他人都忽略了。 – Ether 2010-08-09 21:41:16

+0

如果您在'''字符之前放置'\',則可以避免引號中間的代碼樣式。 – CyberSkull 2016-02-01 03:02:11

相關問題