2013-11-22 61 views
1

我想下面的字符串相匹配的結束匹配:貪婪的性格在串

controller1/action1/something

用下面的正則表達式:

(?P<controller>[[:alnum:]]+)/(?P<action>[[:alnum:]]+)/(.*)

出於某種原因,它不找到字符串的最後部分:something。但是,它的工作原理,當我改變*+在表達式的末尾:

(?P<controller>[[:alnum:]]+)/(?P<action>[[:alnum:]]+)/(.+)

隨着該正則表達式它確實找到something字符串。但我想使用.*(或.*?),因爲我希望這個正則表達式在最後沒有任何東西時也能成功。

所以它也應該成功當字符串是:controller1/action1/

那麼,爲什麼不將其與(.*)(.*?)工作,但與.+的作品?差異應該簡單地說是第一個說「零個或多個字符」和最後一個「一個或多個」。我只是想檢查「零或更多」。

PS。由於複雜的問題,我不想使用^$來表示字符串的開頭和結尾。簡而言之,這種模式並不總是出現在字符串末尾。

+0

看起來像它的作品對我說:[演示](HTTPS ://www.debuggex.com/r/kTVfFXXl_4cva7Jo) – Shai

+1

它也適用於我,[Another Demo](http://regex101.com/r/qG7sG5)。 –

+0

也許發佈您的PHP代碼,並且您正在測試的完整輸入字符串的示例 – Shai

回答

0

So it should also succeed when the string is: controller1/action1/

我懷疑,因爲這是輸入一些大的字符串,這就是爲什麼.*不爲你工作的一部分。建議你張貼一些你的輸入文字的真實例子。

同時你可以試試這個正則表達式:

"#(?P<controller>[^/]+)/(?P<action>[^/]+)/([^/]*)#" 
+1

我以爲他/她特意要求解決方案而不使用'^'和'$' – Shai

+0

@Shai:您說得對,我錯過了最後一行,讓我編輯 – anubhava

+0

我給出的例子正是我在測試中使用的。但你的正則表達式似乎工作正常,謝謝。 – w00

0

你只需要進行選擇性的最後一組,使之匹配controller1/action1/

(?P<controller>[[:alnum:]]+)/(?P<action>[[:alnum:]]+)/(.+)?