正则表达式忽略如果为空

时间:2013-10-02 21:42:28

标签: php regex match

我的正则表达式中有两个条件(在php上使用正则表达式)

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

当我用以下测试第一个条件时,我得到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个匹配组?

2 个答案:

答案 0 :(得分:3)

由于两个与数字匹配的正则表达式的部分是相同的,因此您可以仅在开始时进行交替,而不是在整个正则表达式周围进行交替:

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

使用u修饰符正确匹配UTF-8字符。

答案 1 :(得分:0)

我认为你的正则表达式是压缩的。如果点是缩写。中间的初始它应该被逃脱。下面的建议就像巴马尔那样。如果您不想捕获不同的名称,请从中删除括号。

抱歉,看起来你打算成为一个点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)
      )