2010-02-28 150 views
3

考慮以下字符串:問題(未)貪婪正則表達式

1: cccbbb 

2: cccaaabbb 

我想直到結束都是這樣的比賽:

1: Array 
(
    [1] => 
    [2] => bbb 
) 

2: Array 
(
    [1] => aaa 
    [2] => bbb 
) 

我怎麼能同時匹配在一個正則表達式?
這裏是我的嘗試:

#(aaa)?(.*)$# 

我已經試過的貪婪和ungreedy修改很多變種,但它不工作了。只要我添加'?'一切都在[2]中匹配。使[2]不合理並不會幫助。

我的正則表達式的作品,如果我省略了「CCC」的預期,但我必須讓其他字符開頭...

+0

你能比'。*'更好地指定第二部分嗎?也許用'b *'? – Gumbo 2010-02-28 14:41:18

+0

不幸的是,我只知道第一個'aaa'應該在'[1]' – 2010-02-28 14:55:45

+0

中匹配,那麼'aaa'之前的部分呢? – Gumbo 2010-02-28 14:57:11

回答

3
/(aaa)?((.)\3*)$/ 

會有一個額外的[3]雖然。我不認爲這是一個問題。

+0

這似乎工作!你介意解釋'(。)\ 3 *'部分做什麼? – 2010-02-28 16:13:26

+0

@samy:'(。)'匹配任何字符(\ n除外)。這裏有3個捕獲括號,'(。)'是第3個。 '\ 3 *'部分意味着零個或更多的「東西」,這與第三場比賽相同。所以基本上'(。)\ 3 *'表示一個或多個任意但相同的字符。 – kennytm 2010-02-28 16:16:28

+0

我剛纔發現這不是它。 'bbb'可以包含不同的字符。 'bbb'是problaby不是一個很好的例子。 – 2010-02-28 16:21:52

0

這裏是一個非正則表達式。如果找到,則在「aaa」上搜索並分割,然後將「aaa」的右側的其餘部分存儲到數組中。

$str="cccaaabbb"; 
if (strpos($str,"aaa")!==FALSE){ 
    $array[]="aaa"; 
    $s = explode("aaa",$str); 
    $array[]=end($s); 
} 
print_r($array); 

輸出

$ php test.php 
Array 
(
    [0] => aaa 
    [1] => bbb 
) 

至於[1],這取決於你的標準時,「AAA」是找不到的,它可以作爲獲取起使用strpos從字符4子一樣簡單( )。

0

這將匹配組但它不是非常靈活,你可以把你需要做的更多細節。一次抓住三個角色並評估它們可能會容易得多。

另外我在Poweshell中測試了這個,它的正則表達式略有不同。

(a {3,3})*(b {3,3})

1

感謝您在這裏集思廣益!我終於能夠推測出來的東西說的工作:

^(?:([^a]*)(aaa))?(.*)$ 
+0

但它沒有做你想要的。在你的例子1中,'\ 1'將包含'cccbbb';在你的例子2中,'\ 1'包含'ccc','\ 2'包含'aaa','\ 3'包含'bbb'。 你真的想做什麼? – 2010-02-28 16:53:13

+0

不,在示例1中,\ 3將包含「cccbbb」,並帶有此RegExp。 '\ 1'只能和'\ 2'結合使用,試試看。 – 2010-02-28 17:42:30

+0

這是如何匹配'cbbbb'的'bbb'? – kennytm 2010-02-28 19:08:40

0

這樣做:

$sPattern = "/(aaa?|)(bbb)/"; 

這個效果很好。