2013-10-02 152 views
1

我有兩個條件在我正則表達式(PHP的使用正則表達式)正則表達式忽略如果空

(BIOLOGIQUES\s+(\d+)\s+(\d+)\s+\/\s+(\d+))|(Dossier N.\s+:\s+(\d+)\s+(\d+)\s+\/\s+(\d+)) 

當我測試使用以下的第一條件I得到4個匹配組1 2 3和4

BIOLOGIQUES                       47  131002/4302 

請在這裏看到的第一條件http://www.rubular.com/r/a6zQS8Wth6

但是,當我與所述第二條件組匹配測試是5 6 7和8

Dossier N°  :  47  131002/4302 

第二個條件的位置:http://www.rubular.com/r/eYzBJq1rIW

有沒有辦法總是有1 2 3 4比賽團體在第二個狀態呢?

+1

你有他們在同一個正則表達式。爲什麼不把它們分開? – 2013-10-02 21:49:18

+0

如果這是您想要的行爲,那麼您的正則表達式應該更像「BIOLOGIQUES」或「Dossier N°:」後跟數字組「。 IOW,「或」條件僅對於正則表達式的第一個組件是必需的。 – user113215

回答

3

由於匹配的數字是相同的,這兩個正則表達式的部分,你可以做的交替只是開始,而不是圍繞整個正則表達式:

preg_match('/((?:BIOLOGIQUES|Dossier N.\s+:)\s+(\d+)\s+(\d+)\s+\/\s+(\d+))/u', $content, $match); 

使用u修改以符合UTF- 8個字符正確。

+0

你好在http://www.rubular.com/它工作正常 但是當我把它放在php它有一個奇怪的行爲 隨着第一個條件我得到了: [0] => BIOLOGIQUES 47 131002/4302 [1] => BIOLOGIQUES 47四千三百○二分之十三萬一千○二 [2] => 47 [3] => 131002 [4] => 4302 第二條件無關 PHP: 的preg_match(「/((?: BIOLOGIQUES | Dossier N. \ s +:)\ s +(\ d +)\ s +(\ d +)\ s + \/\ s +(\ d +))/「,$ content,$ codes2); print_r($ code2); – amorino

+0

PHP在'N'後面似乎遇到了一個特殊字符問題,它不會將它視爲單個字符。如果我用普通的ASCII字符替換它,它就可以工作。 – Barmar

+0

http:// stackoverflow。com/questions/1725227/preg-match-and-utf-8-in-php – Barmar

0

我假設你的正則表達式是壓縮的。如果點的意思是縮寫。中間的首字母應該逃脫。下面的建議因素就像Barmar's一樣。如果您不想捕獲不同的名稱,請從它們中刪除括號。

對不起,它看起來像你打算它是一個點metachar。從中刪除\。

# (?:(BIOLOGIQUES)|(Dossier\ N\.\s+:))\s+((\d+)\s+(\d+)\s+\/\s+(\d+)) 

(?: 
     (BIOLOGIQUES)     # (1) 
    | (Dossier\ N \. \s+ :)   # (2) 
) 
\s+ 
(        # (3 start) 
     (\d+)       # (4) 
     \s+ 
     (\d+)       # (5) 
     \s+ \/ \s+ 
     (\d+)       # (6) 
)        # (3 end) 

編輯,正則表達式應該被考慮,但如果它變得太不同,一種方式重新使用相同的捕獲組是使用Branch Reset
這是您的原始代碼,使用分支重置進行一些註釋。

(?|(BIOLOGIQUES\s+(\d+)\s+(\d+)\s+\/\s+(\d+))|(Dossier\ N.\s+:\s+(\d+)\s+(\d+)\s+\/\s+(\d+))) 

     (?| 
br 1  (        # (1 start) 
       BIOLOGIQUES \s+ 
     2   (\d+)       # (2) 
       \s+ 
     3   (\d+)       # (3) 
       \s+ \/ \s+ 
     4   (\d+)       # (4) 
    1  )        # (1 end) 
     | 
br 1  (        # (1 start) 
       Dossier\ N . \s+ : \s+ 
     2   (\d+)       # (2) 
       \s+ 
     3   (\d+)       # (3) 
       \s+ \/ \s+ 
     4   (\d+)       # (4) 
    1  )        # (1 end) 
    ) 

或者,你可以因素,並使用分支復位。

# (?|(BIOLOGIQUES\s+)|(Dossier\ N.\s+:\s+))(?:(\d+)\s+(\d+)\s+\/\s+(\d+)) 

     (?| 
br 1  (BIOLOGIQUES \s+)    # (1) 
     | 
br 1  (Dossier\ N . \s+ : \s+)  # (1) 
    ) 
     (?: 
2   (\d+)       # (2) 
      \s+ 
3   (\d+)       # (3) 
      \s+ \/ \s+ 
4   (\d+)       # (4) 
    )