我正在瀏覽一些舊的代碼庫,並且遇到了兩個我認爲語義相同的正則表達式部分。想知道Stackoverflow社區可以證實我的理解。。+之間的區別(如果有)。和*
正則表達式1:(?+) - 一個或多個字符,但可選
正則表達式2: - 零個或多個字符
我一直在不同的場景思維,但不能(*)。想想兩個表達式都不相同的任何輸入。
我正在瀏覽一些舊的代碼庫,並且遇到了兩個我認爲語義相同的正則表達式部分。想知道Stackoverflow社區可以證實我的理解。。+之間的區別(如果有)。和*
正則表達式1:(?+) - 一個或多個字符,但可選
正則表達式2: - 零個或多個字符
我一直在不同的場景思維,但不能(*)。想想兩個表達式都不相同的任何輸入。
(.+?)
意味着匹配的一個或多個字符,但代替默認貪婪匹配(匹配儘可能),則?
量詞後使匹配懶惰(匹配儘可能少)。
概念上,貪婪匹配將首先嚐試可能由內部模式形成的最長可能的序列,然後在發動機回溯時逐漸減少序列的長度。延遲匹配將首先嚐試可能由內部模式形成的最短序列,然後在引擎回溯時逐漸增加序列的長度。
因此,(.+?)
和(.*)
是完全不同的。給定字符串,模式(.+?)
將匹配"a"
的第一場比賽,而(.*)
將匹配第一場比賽。
當您將模式更正爲預期含義時:((?:.+)?)
,它與行爲中的(.*)
完全相同。由於量詞默認爲貪婪,因此((?:.+)?)
在嘗試空字符串的情況下將首先嚐試.+
的情況。並且.+
將嘗試1個字符序列之前的最長序列。因此,((?:.+)?)
的效果與(.*)
完全相同:它會逐漸找到最長的序列並回溯到空字符串的情況。
首先,
. 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
不會總是捕獲0個字符然後'+?'總是捕獲1(如果可能)? – BlackVegetable 2013-02-21 14:36:01
錯誤。 '(。+?)'是一個或多個字符,** lazy **匹配(匹配儘可能少)。 – nhahtdh 2013-02-21 02:43:19
@nhahtdh Err,那就是答案。你爲什麼不把它貼出來? – BlackVegetable 2013-02-21 02:44:33
謝謝@nhahtdh清理我的困惑 – 2013-02-21 02:52:51