2013-11-25 123 views
0

我試圖從相當簡單的字符串中拉出匹配。在我的輸入字符串,一般模式有云:s(definitely a number)e(maybe some characters)s...控制正則表達式空匹配

例輸入:s1e1s2e2s3es4e4

預計匹配陣:[{1,1},{2,2},{3,''},{4,4}]

我曾嘗試:

/s(\d)e([\d\:]+)?/g並獲得[{1,1},{2,2},{3},{4,4}]這是非常接近的,但我需要第三組中的空字符串。

,我天真地試圖

/s(\d)e(.*?)?/g這給了我[{1,''},{2,''},{3,''},{4,''}]

我寧願告訴正則表達式的任何字符相匹配,而不是在第一個例子中使用的字符類的。

除了一個簡單的工作解決方案,解釋我的誤解也會很好。

+0

這是什麼語言? – Barmar

+0

使用preg_match_all()在PHP中執行此操作,但是我正在regex101.com上測試正則表達式 –

+0

它對'preg_match_all'按預期工作,不得不刪除'g'修飾符。 – Barmar

回答

1

試試這個:

$pattern = '~s(\d)e([\d\:]*?(?=s\d|:|$))~'; 

現在您的捕獲組可以匹配一個空字符串,並沒有更多的可選項。

我已經添加了一個前瞻來檢查是否有另一個「s \ d」後或:或字符串的結尾。

編輯:既然「S」是不是第二個捕獲組的允許,你可以簡單的寫:

$pattern = '~s(\d)e([^s]*)~'; 
+0

啊,那麼簡單。我怎麼能在'e'之後做同樣的事情,但沒有字符類,以便匹配任何東西或空字符串,直到它碰到下一個's'? –

+1

使用一個符合's'除外的字符類:'[^ s] *' – Barmar

+0

@ parker.sikand:Barmar有答案,我會在我的文章中添加一個編輯。 –

2

使用preg_match_allPREG_PATTERN_ORDER選項(默認)。然後它不會遺漏可選組,這些可選組在結果中不匹配任何內容。

+0

將其他答案標記爲正確,只是因爲它解決了一般正則表達式的問題,這就是我提出問題的方式。但是,這個PHP的具體信息非常有用。 –

0

我認爲這個s(\d)e(\d|)應該適用於你的例子。我不知道結腸是什麼。