例如,返回axxxghdfx445
中最後一個x
後面的字符串部分(應返回445
)。如何匹配perl正則表達式中最後一次出現字符後的所有內容?
回答
my($substr) = $string =~ /.*x(.*)/;
從的perldoc perlre:
默認情況下,量化的子模式是「貪婪」,也就是說,它將匹配 多次地(給定一個特定的起始位置),而 仍允許其餘的模式匹配。
這就是爲什麼.*x
將匹配高達x
的最後一次出現。
最簡單的方法是使用/([^x]*)$/
第一個答案是好的,但 談「的東西,不包含」當... 我喜歡用「匹配」正則表達式它
my($substr) = $string =~ /.*x([^x]*)$/;
在某些情況下非常有用
正則表達式:/([^x]+)$/
#assuming x is not last element of the string.
最簡單的方法不是正則表達式,而是一個簡單的split()並獲取最後一個元素。
$string="axxxghdfx445";
@s = split /x/ , $string;
print $s[-1];
真的值得創建一個臨時數組嗎? 'print(split/x /,$ string)[ - 1];'也可以。 – Zaid 2010-08-09 11:04:58
取決於對嗎?如果我想使用其他元素呢? – ghostdog74 2010-08-09 11:51:21
另一種方式來做到這一點。它不像單個正則表達式那麼簡單,但是如果您爲速度進行優化,則此方法可能比使用正則表達式的任何方法都快,其中包括split
。
my $s = 'axxxghdfx445';
my $p = rindex $s, 'x';
my $match = $p < 0 ? undef : substr($s, $p + 1);
我很驚訝沒有人提到的特殊變量,這樣做,$'
:「$'
」返回匹配的字符串之後的一切。 (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部分,並且 沒有性能損失。
除非您正在捕捉「x」的第一個出現,而不是最後一個。 – runrig 2010-08-09 18:03:28
@runrig:哈哈,這樣會讓我的整篇論文脫軌:)事實上,在這種特殊情況下,'/ x([^ x] *)$ /'會更好......我太習慣於描述'$' ',其他人都忽略了。 – Ether 2010-08-09 21:41:16
如果您在'''字符之前放置'\',則可以避免引號中間的代碼樣式。 – CyberSkull 2016-02-01 03:02:11
- 1. 正則表達式得到最後一次出現前後的所有內容
- 2. 正則表達式匹配模式的所有最後一次出現
- 3. 正則表達式匹配從最後一次出現的任何關鍵字的所有內容
- 4. 正則表達式只匹配最後一次出現
- 5. PHP的正則表達式匹配模式匹配的最後一次出現
- 6. Python正則表達式匹配所有,但最後一次出現
- 7. 正則表達式匹配最後一次出現與特定字符串
- 8. 正則表達式匹配兩個字符串之間所有字符的最後一次出現
- 9. Perl正則表達式替換點後的最後一個匹配字符串
- 10. 正則表達式匹配問號後的所有內容?
- 11. perl正則表達式匹配一個字符後面的所有單詞
- 12. 正則表達式匹配所有內容,但最後四位數字
- 13. 正則表達式匹配最後一段標記和內容
- 14. 正則表達式匹配所有在第一次出現後出現的字符*
- 15. 正則表達式匹配不止一次出現的字符
- 16. 多行正則表達式:匹配最後一次出現只有
- 17. 正則表達式 - 匹配的字符串中第一次出現的所有行,直到下一次出現
- 18. 最後一個字符串與正則表達式不匹配
- 19. 如何有效地匹配Perl正則表達式中已匹配的內容?
- 20. 正則表達式匹配所有內容截至及包括最後括號
- 21. 正則表達式匹配多次出現的字符串
- 22. 正則表達式最後一次出現仍然有關鍵字後
- 23. 正則表達式:找到最後一次出現的模式
- 24. 正則表達式,刪除最後一個正斜槓後的所有內容
- 25. 在最後一次正則表達式匹配之前修剪所有文本
- 26. R正則表達式:找到最後一次匹配
- 27. Python-正則表達式輸出最後一次出現[HTML Scraping]
- 28. 正則表達式的最後一次出現:和.tst
- 29. 正則表達式查找字符串的最後一次出現在URL
- 30. 正則表達式來打通第二個字符串中最後一次出現匹配
+1確實非常有用 – 2010-08-09 10:53:28
您不需要正則表達式中的前導'。* x'。 – runrig 2010-08-09 18:00:32
這是正確的,謝謝,但這是爲了說明「doeas不包含x的東西」 – benzebuth 2010-08-10 07:48:24