1

我的正则表达式中有两个条件(用于 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 个匹配组?

4

2 回答 2

3

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

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

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

于 2013-10-02T21:49:29.957 回答
0

我假设你的正则表达式是压缩的。如果点是缩写。中间的首字母应该被转义。下面的建议与 Barmar 的建议一样。如果您不想捕获不同的名称,请从它们中删除括号。

抱歉,您似乎打算将其用作点元字符。只需从中删除 \。

 # (?:(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)
      )
于 2013-10-02T22:16:05.600 回答