<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.subpatterns.php',
    1 => 'Subpatrones',
    2 => 'Subpatrones',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Sintaxis de expresiones regulares PCRE',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.internal-options.php',
    1 => 'Configuraci&oacute;n de opciones internas',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.repetition.php',
    1 => 'Repetici&oacute;n',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Subpatrones</h2>
  <p class="para">
   Los subpatrones están delimitados por paréntesis (paréntesis redondos),
   que pueden anidarse. Marcar una parte de un patrón como subpatrón
   hace dos cosas:
  </p>
  <ol type="1">
   <li class="listitem">
    <p class="para">
     Localiza un conjunto de alternativas. Por ejemplo, el patrón
     <code class="literal">cat(aract|erpillar|)</code> coincide con una de las palabras &quot;cat&quot;,
     &quot;cataract&quot;, o &quot;caterpillar&quot;. Sin los paréntesis, coincidiría
     con &quot;cataract&quot;, &quot;erpillar&quot; o la cadena vacía.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Establece el subpatrón como un subpatrón de captura (como se definió anteriormente).
     Cuando todo el patrón coincide, la porción de la cadena de sujeto
     que coincidió con el subpatrón se devuelve al llamador a través del
     argumento <em>ovector</em> de <span class="function"><strong>pcre_exec()</strong></span>.
     Los paréntesis de apertura se cuentan de izquierda a derecha (comenzando desde 1) para
     obtener los números de los subpatrones de captura.
    </p>
   </li>
  </ol>
  <p class="para">
   Por ejemplo, si la cadena &quot;the red king&quot; se compara con
   el patrón

   <code class="literal">the ((red|white) (king|queen))</code>

   las subcadenas capturadas son &quot;red king&quot;, &quot;red&quot;, y &quot;king&quot;,
   y están numeradas 1, 2, y 3.
  </p>
  <p class="para">
   El hecho de que los paréntesis simples cumplan dos funciones no
   siempre es útil. Hay momentos en los que se requiere un subpatrón de agrupación
   sin un requisito de captura. Si un paréntesis de apertura es seguido por &quot;?:&quot;, el subpatrón no
   realiza ninguna captura, y no se cuenta al calcular el número de cualquier subpatrón de captura posterior. Por ejemplo, si la cadena &quot;the white queen&quot; se compara con
   el patrón

   <code class="literal">the ((?:red|white) (king|queen))</code>

   las subcadenas capturadas son &quot;white queen&quot; y &quot;queen&quot;, y
   están numeradas 1 y 2. El número máximo de subcadenas capturadas
   es 65535. Puede que no sea posible compilar patrones tan grandes,
   sin embargo, dependiendo de las opciones de configuración de libpcre.
  </p>
  <p class="para">
   Como abreviatura conveniente, si se requieren configuraciones de opciones
   al inicio de un subpatrón no de captura, las letras de opciones pueden aparecer entre
   el &quot;?&quot; y el &quot;:&quot;. Por lo tanto, los dos patrones
  </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">
   coinciden exactamente con el mismo conjunto de cadenas. Debido a que las ramas alternativas se prueban de izquierda a derecha, y las opciones no se restablecen hasta que se alcanza el final del subpatrón, una configuración de opción en una rama afecta a las ramas posteriores, por lo que los patrones anteriores coinciden con &quot;SUNDAY&quot; así como con &quot;Saturday&quot;.
  </p>

  <p class="para">
   Es posible nombrar un subpatrón usando la sintaxis
   <code class="literal">(?P&lt;name&gt;pattern)</code>. Este subpatrón luego
   será indexado en el array de coincidencias por su posición numérica normal y
   también por nombre. Hay dos sintaxis alternativas
   <code class="literal">(?&lt;name&gt;pattern)</code> y <code class="literal">(?&#039;name&#039;pattern)</code>.
  </p>

  <p class="para">
   A veces es necesario tener múltiples coincidencias alternativas
   en una expresión regular. Normalmente, cada una de estas tendría
   su propio número de referencia inversa, aunque solo una de ellas podría coincidir.
   Para superar esto, la sintaxis <code class="literal">(?|</code> permite tener números duplicados. Considere el siguiente regex aplicado a la cadena <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">
   Aquí <code class="literal">Sun</code> se almacena en la referencia inversa 2, mientras que
   la referencia inversa 1 está vacía. Hacer coincidir <code class="literal">Saturday</code> produce
   <code class="literal">Sat</code> en la referencia inversa 1 mientras que la referencia inversa 2 no existe. Cambiar el patrón para usar <code class="literal">(?|</code> resuelve este problema:
  </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">
   Usando este patrón, tanto <code class="literal">Sun</code> como <code class="literal">Sat</code>
   se almacenarían en la referencia inversa 1.
  </p>
 </div><?php manual_footer($setup); ?>