如果为空,则忽略正则表达式


Regex ignore if empty

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

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

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

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

我假设你的正则表达式是压缩的。如果点是用来缩写中间首字母的,则应对其进行转义。下面的建议就像巴马尔一样。如果不想捕获不同的名称,请从中删除括号。

抱歉,看起来您打算将其用作点元字符。只需从中删除 ''。

 # (?:(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)
      )
相关文章: