2013-01-08 65 views
0

從此tutorial我瞭解了「正則表達式 - 量詞」,並基於此教程中使用的test code正則表達式:爲什麼?模式匹配任何字符串中的空字符串「」,包括「a」本身?

Enter your regex: a?? 
Enter input string to search: a 
I found the text "" starting at index 0 and ending at index 0. 
I found the text "" starting at index 1 and ending at index 1. 

而且

Enter your regex: a?? 
Enter input string to search: aaa 
I found the text "" starting at index 0 and ending at index 0. 
I found the text "" starting at index 1 and ending at index 1. 
I found the text "" starting at index 2 and ending at index 2. 
I found the text "" starting at index 3 and ending at index 3. 

而且

Enter your regex: a?? 
Enter input string to search: cab 
I found the text "" starting at index 0 and ending at index 0. 
I found the text "" starting at index 1 and ending at index 1. 
I found the text "" starting at index 2 and ending at index 2. 
I found the text "" starting at index 3 and ending at index 3. 

爲什麼?

回答

4

??是一個量詞,所以它說量化詞應該匹配多少次,0或1次,最好是0??本身不會匹配任何東西,它只是裝飾另一個表達式,說明在被測試的字符串中匹配表達式的次數。

IFF表達的其餘部分不與lazy0 times部分匹配匹配,它將與1 time部分匹配再試一次。

確實,如果整個正則表達式只包含某個術語的惰性可選匹配項,那麼總是匹配測試字符串內的空位置。所以這種量詞只有在周圍有其他詞時纔有用。例如,表達式ba??d將首先嚐試匹配bd,然後bad

但是,爲什麼正則表達式匹配字符串中的每個字符一次(加上一個字符)?那麼,空匹配是一個有效的正則表達式。例如,搜索^$(字符串的開頭和結尾)將產生匹配,儘管爲空。對於這個「無用」表達式也是一樣,測試字符串內的每個位置都是表達式的有效匹配,不會對匹配施加任何約束。

+0

+1 @Cerbrus:這也回答你的問題。 – tripleee

0

這是因爲你正在做?運營商LAZY與?所以它會匹配儘可能少。

您正在嘗試匹配a 0或1次,但是您要求正則表達式引擎匹配得儘可能少,因此它將匹配0次,並且匹配字符串中的許多字符(+1) 。

+0

實際上是否有'''匹配任何東西? – Cerbrus

+0

其實我昨天看過它,我不認爲它會匹配。這只是量詞本身讓他們懶惰的一個通用量詞。 –

相關問題