1

正規表現には2つの条件があります(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

しかし、2 番目の条件でテストすると、グループの一致は 5 6 7 と 8 です

   Dossier N°       :     47     131002 / 4302

2 番目の条件: http://www.rubular.com/r/eYzBJq1rIW

2 番目の条件でも常に 1 2 3 と 4 の一致グループを持つ方法はありますか?

4

2 に答える 2

3

数値に一致する両方の正規表現の部分は同じであるため、正規表現全体ではなく、最初だけを交互にすることができます。

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

修飾子を使用して、uUTF-8 文字を正しく一致させます。

于 2013-10-02T21:49:29.957 に答える
0

あなたの正規表現は圧縮されていると思います。ドットが略語の場合。中間のイニシャルはエスケープする必要があります。以下の提案は、Barmar's のように考慮に入れられています。異なる名前をキャプチャしたくない場合は、括弧を削除してください。

申し訳ありませんが、ドット メタ文字を意図しているようです。\ を削除するだけです。

 # (?:(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 に答える