2013-02-21 65 views
2

我正在瀏覽一些舊的代碼庫,並且遇到了兩個我認爲語義相同的正則表達式部分。想知道Stackoverflow社區可以證實我的理解。。+之間的區別(如果有)。和*

正則表達式1:(?+) - 一個或多個字符,但可選

正則表達式2: - 零個或多個字符

我一直在不同的場景思維,但不能(*)。想想兩個表達式都不相同的任何輸入。

+4

錯誤。 '(。+?)'是一個或多個字符,** lazy **匹配(匹配儘可能少)。 – nhahtdh 2013-02-21 02:43:19

+0

@nhahtdh Err,那就是答案。你爲什麼不把它貼出來? – BlackVegetable 2013-02-21 02:44:33

+0

謝謝@nhahtdh清理我的困惑 – 2013-02-21 02:52:51

回答

7

(.+?)意味着匹配的一個或多個字符,但代替默認貪婪匹配(匹配儘可能),則?量詞後使匹配懶惰(匹配儘可能少)。

概念上,貪婪匹配將首先嚐試可能由內部模式形成的最長可能的序列,然後在發動機回溯時逐漸減少序列的長度。延遲匹配將首先嚐試可能由內部模式形成的最短序列,然後在引擎回溯時逐漸增加序列的長度。

因此,(.+?)(.*)是完全不同的。給定字符串​​,模式(.+?)將匹配"a"的第一場比賽,而(.*)將匹配​​第一場比賽。

當您將模式更正爲預期含義時:((?:.+)?),它與行爲中的(.*)完全相同。由於量詞默認爲貪婪,因此((?:.+)?)在嘗試空字符串的情況下將首先嚐試.+的情況。並且.+將嘗試1個字符序列之前的最長序列。因此,((?:.+)?)的效果與(.*)完全相同:它會逐漸找到最長的序列並回溯到空字符串的情況。

3

首先,

. is any character 

下一頁

* is zero or more 
+ is one or more 
? is one or zero 

你想,。+?是我猜測中的一個或多個任意角色和0或1個? 你缺少這樣的:

懶修改

*? is zero or more getting as few as possible 
+? is one or more getting as few as possible 

看到這裏的進一步討論 Greedy vs. Reluctant vs. Possessive Quantifiers

+0

不會總是捕獲0個字符然後'+?'總是捕獲1(如果可能)? – BlackVegetable 2013-02-21 14:36:01

相關問題