2011-06-14 142 views
1

(?:)(?=)之間的區別我假定第一個返回匹配函數中匹配的文本(但不適用於子表達式組號,但不知道是否我在預先感謝:-)我知道他們用於什麼,但我不知道他們如何行事不同。也可以重複字符應用於前瞻斷言?Javascript/Perl正則表達式

回答

2

所以關於這兩個構造的事情是不要返回任何東西。 (?: ...)的使用方式與普通(...)相同,只是其結果未被捕獲並且未返回。在Perl中,我相信Javascript,由於Regex引擎無需記住匹配的子字符串,因此可以提高性能。

(?=)的想法是不同的。你可以將任何一個正則表達式的組件認爲是「吃掉」匹配字符串的一些子集。但不是(?=)。另一種想法是,(?=)匹配在(?=)本身匹配的字符串完全相同的地方,而不是在它像一個正常組結束後匹配。

+0

當你說不回來時,你的意思是什麼? – rubixibuc 2011-06-14 03:02:39

+0

這是捕獲'()'和非捕獲'(?:)'組之間的區別。使用非捕獲功能後,您無法找到源文件中匹配該特定子模式的文本,只有在整個模式匹配的情況下它必須匹配。 – Dan 2011-06-14 03:27:51

3

(?:)創建一個組,不會被捕獲,即存儲在任何後向引用中。它通常用在你需要一個組的地方,但不關心它在一個捕獲組中。這可以提高性能並清理反向引用。

(?=)是一個超前的斷言。它被用來尋找一些東西,而不是消耗任何角色作爲匹配。