<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.onlyonce.php',
    1 => 'Sub-express&otilde;es de ocorr&ecirc;ncia &uacute;nica',
    2 => 'Sub-express&otilde;es de ocorr&ecirc;ncia &uacute;nica',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Sintaxe das express&otilde;es regulares PCRE',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.assertions.php',
    1 => 'Afirma&ccedil;&otilde;es',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.conditional.php',
    1 => 'Sub-express&otilde;es condicionais',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    '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.onlyonce" class="section">
  <h2 class="title">Sub-expressões de ocorrência única</h2>
  <p class="para">
   Tanto com a maximização quanto com a minimização da repetição, a falha no
   que se segue normalmente faz com que o item repetido seja
   reavaliado para ver se um número diferente de repetições permite que o
   resto da expressão corresponda. Às vezes é útil
   evitar isso, seja para mudar a natureza da correspondência ou
   para fazer com que ela falhe antes do que aconteceria de outra forma, quando o
   autor da expressão sabe que não há sentido em
   continuar.
  </p>
  <p class="para">
   Considere, por exemplo, a expressão \d+foo quando aplicada à
   linha

   <code class="literal">123456bar</code>
  </p>
  <p class="para">
   Depois de corresponder a todos os 6 dígitos e depois falhar em corresponder a &quot;foo&quot;,
   a ação normal do algoritmo de correspondência é tentar novamente com somente 5
   dígitos correspondendo ao item \d+, e depois com 4, e assim por diante,
   até falhar na última vez. Sub-expressões de ocorrência única fornecem o
   meio de especificar que uma vez que a parte da expressão tenha sido
   correspondida, ela não deve ser reavaliada desta forma, portanto o
   algoritmo desistiria imediatamente ao falhar na correspondência a &quot;foo&quot;
   na primeira vez. A notação é um outro tipo de parêntese
   especial, iniciando com (?&gt; como neste exemplo:

   <code class="literal">(?&gt;\d+)bar</code>
  </p>
  <p class="para">
   Este tipo de parênteses &quot;trava&quot; a parte da expressão
   que eles contém uma vez que tenha sido correspondida, e uma falha mais para a frente na
   expressão é impedida de rastreá-la retroativamente.
   O restreamento retroativo depois deles para itens anteriores, entretanto, funciona normalmente.
  </p>
  <p class="para">
   Uma descrição alternativa é que uma sub-expressão deste tipo
   corresponde à string de caracteres que uma expressão idêntica
   avulsa corresponderia, se ancorada no ponto atual
   da string de entrada.
  </p>
  <p class="para">
   Sub-expressões de ocorrência única não são sub-expressões de captura. Casos
   simples como o exemplo acima podem sem pensados como uma repetição de
   maximização que precisa consumir tudo o que ela puder. Portanto,
   enquanto ambos \d+ e \d+? são preparados para ajustar o número de
   dígitos que eles correspondem para fazer com o que o resto da expressão
   tenha correspondência, (?&gt;\d+) pode somente corresponder a uma sequência inteira de dígitos.
  </p>
  <p class="para">
   Obviamente, esta contrução pode conter sub-expressões arbitrariamente
   complexas, e ela pode ser aninhada.
  </p>
  <p class="para">
   Sub-expressões de ocorrência única podem ser usadas em conjunção com
   afirmações que olham para trás para especificar correspondência eficiente no final
   da string. Considere a expressão simples

   <code class="literal">abcd$</code>

   quando aplicada a uma string longa que não corresponde. Como
   a correspondência procede da esquerda para a direita, o PCRE irá procurar
   cada &quot;a&quot; na string e depois ver se o que vem a seguir corresponde ao
   resto da expressão. Se a expressão for especificada como

   <code class="literal">^.*abcd$</code>,

   o .* inicial corresponderá à string inteira primeito, mas
   quando isso falhar (porque não existe um &quot;a&quot; a seguir), ela
   faz um rastreamento retroativo para corresponder a todos os caracteres exceto ao último, e depois todos exceto
   os últimos dois, e assim por diante. Uma vez mais a pesuisa
   por &quot;a&quot; cobre a string inteira, da direita para a esquerda, portanto
   não melhorou em nada. Porém, se a expressão for escrita como

   <code class="literal">^(?&gt;.*)(?&lt;=abcd)</code>,

   não poderá haver rastreamento retroativo para o item &quot;.*&quot;. ele pode
   corresponder somente à string inteira. A afirmação subsequente
   faz um teste simples nos últimos quatro caracteres. Se
   ela falhar, a correspondência falha imediatamente. Para strings longas,
   este métodos faz uma diferença significativa no tempo de processamento.
  </p>
  <p class="para">
   Quando uma expressão contém uma repetição ilimitada dentro de uma sub-expressão
   que pode ser repetida um número ilimitado de
   vezes, o uso de uma sub-expressão de ocorrência única é a única maneira de
   evitar que algumas correspondências com falha demorem muito tempo.
   A expressão

   <code class="literal">(\D+|&lt;\d+&gt;)*[!?]</code>

   corresponde a um número ilimitado de sub-expressões que consistem
   de não-dígitos, ou de dígitos envolvidos por &lt;&gt;, seguidos por
   ! ou ?. Quando ela é correspondida, é executada rapidamente. Porém, se
   for aplicada a

   <code class="literal">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</code>,

   ela leva um longo tempo antes de reportar falha. Isso ocorre
   porque a string pode ser dividida entre as duas repetições de
   várias maneiras e todas precisam ser tentadas. (O exemplo
   usou [!?] em vez de um único caractere no final,
   porque tanto o PCRE quanto o Perl têm uma otimização que permite
   falha rápida quando um único caractere é usado. Eles
   lembram o último caractere único necessário para uma
   correspondência, e falhar antecipadamente se não estiver presente na string.)
   Se a expressão for alterada para

   <code class="literal">((?&gt;\D+)|&lt;\d+&gt;)*[!?]</code>,

   sequências de não-dígitos não podem ser quebradas, e a falha acontece rapidamente.
  </p>
 </div><?php manual_footer($setup); ?>