<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/reference.pcre.pattern.syntax.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.subpatterns.php',
    1 => 'サブパターン',
    2 => 'サブパターン',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'PCRE 正規表現構文',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.internal-options.php',
    1 => '内部オプション設定',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.repetition.php',
    1 => '繰り返し',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/pcre/pattern.syntax.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="regexp.reference.subpatterns" class="section">
     <h2 class="title">サブパターン</h2>
     <p class="para">
     サブパターンは、丸カッコで括られたパターンのことで、ネストも可能です。
     パターンの一部をサブパターンにすると、以下の 2 つのことが可能になります。
    </p>
  <ol type="1">
   <li class="listitem">
    <p class="para">
     選択肢の範囲の指定 (localize)。例えば、パターン
     <code class="literal">cat(aract|erpillar|)</code>
     は、単語 &quot;cat&quot;, &quot;cataract&quot;, &quot;caterpillar&quot; にマッチします。
     カッコをつけないと、このパターンは、&quot;cataract&quot;, &quot;erpillar&quot;
     または空の文字列にマッチしてしまいます。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     サブパターンによる値の取得（キャプチャ）。
     パターン全体としてマッチに成功した場合、対象文字列の内、
     サブパターンにマッチした部分の値がコールした側に
     (<span class="function"><strong>pcre_exec()</strong></span> の引数 <em>ovector</em> で)
     返されます。
     開きカッコの数が（1 から始まって）左から右に数えられ、
     キャプチャ用サブパターン (capturing subpattern) の番号が指定されます。
    </p>
   </li>
  </ol>
    <p class="para">
     例えば、文字列 &quot;the red king&quot; に対し、パターン

      <pre class="literallayout">
      the ((red|white) (king|queen))
      </pre>

     をマッチングさせた場合、キャプチャされる部分文字列は、
     &quot;red king&quot;, &quot;red&quot;, &quot;king&quot; であり、
     それぞれ 1 番, 2 番, 3 番と番号がふられます。
    </p>
    <p class="para">
     カッコに 2 つの機能があるということが、いつも良い方に働くわけでは
     ありません。値をキャプチャする必要はないが、グループ分けのために
     サブパターンを複数用いたい場合も少なくありません。開きカッコの後に 
     &quot;?:&quot; を付けると、そのサブパターンは値のキャプチャを行わず、
     キャプチャ用サブパターンの番号としてもカウントされません。例えば、
     文字列 &quot;the white queen&quot; に対し、次のパターンをマッチングさせてみましょう。
     
      <pre class="literallayout">
      the ((?:red|white) (king|queen))
      </pre>

     キャプチャされる部分文字列は、&quot;white queen&quot; と &quot;queen&quot; であり、
     それぞれ 1 番と 2 番に番号付けされます。キャプチャ可能な部分文字列の
     数は最大で 65535 までです。
     そんな大量のパターンをコンパイルするのはそもそも無理かもしれませんが、
     そのあたりは libpcre の configure 時のオプションしだいです。
    </p>
    <p class="para">
     簡略形として、値のキャプチャをしないサブパターンの先頭で
     オプションの設定をする場合、オプションの文字を &quot;?&quot; と &quot;:&quot; 
     の間に入れることができます。つまり、次の 2 つのパターン、
    </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
(?i:saturday|sunday)
(?:(?i)saturday|sunday)
</pre></div>
   </div>

  </div>

    <p class="para">
     は、まったく同じ文字列集合にマッチします。
     選択肢は左から右に試行され、オプションはサブパターンの終端に達するまで
     リセットされないので、ある選択枝にあるオプション設定は後に続く
     選択枝にも作用します。このため、上のパターンは、&quot;Saturday&quot; と同様に
     &quot;SUNDAY&quot; にもマッチします
     </p>
     
     <p class="para">
      <code class="literal">(?P&lt;name&gt;pattern)</code> という記法を用いて
      サブパターンに名前をつけることができます。
      このサブパターンにマッチした部分は、マッチ時に返される配列内で
      通常どおりの数値添字によるアクセスだけでなく名前でもアクセスできるようになります。
      二通りの別の構文
      <code class="literal">(?&lt;name&gt;pattern)</code> および <code class="literal">(?&#039;name&#039;pattern)</code>
      も用意されています。
     </p>

  <p class="para">
   複数の条件にマッチさせたいときに、
   ひとつの正規表現の中でサブグループを切り替えなければならないこともあります。
   通常は、たとえその中のいずれかひとつにしかマッチしなかったとしても
   それぞれに個別の後方参照番号が振られます。
   これを解決するために使えるのが <code class="literal">(?|</code> 構文で、
   重複した番号を振ることができるようになります。
   次の正規表現で文字列
   <code class="literal">Sunday</code> をマッチングするとどうなるでしょうか。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>(?:(Sat)ur|(Sun))day</pre></div>
   </div>

  </div>

  <p class="para">
   <code class="literal">Sun</code> が後方参照 2 に格納され、
   後方参照 1 は空となります。
   <code class="literal">Saturday</code> にマッチした場合は
   後方参照 1 に存在する <code class="literal">Sat</code> に入り、
   後方参照 2 は存在しません。
   この問題を解決するには、パターンを変更して
   <code class="literal">(?|</code> を使うようにします。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>(?|(Sat)ur|(Sun))day</pre></div>
   </div>

  </div>

  <p class="para">
   このパターンを使えば、<code class="literal">Sun</code> と <code class="literal">Sat</code>
   の両方が後方参照 1 に格納されます。
  </p>
 </div><?php manual_footer($setup); ?>