<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/pcre.pattern.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'reference.pcre.pattern.differences.php',
    1 => 'Perl とは異なる点',
    2 => 'Perl との違い',
  ),
  'up' => 
  array (
    0 => 'pcre.pattern.php',
    1 => 'PCRE のパターン',
  ),
  'prev' => 
  array (
    0 => 'reference.pcre.pattern.modifiers.php',
    1 => '正規表現パターンに使用可能な修飾子',
  ),
  'next' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'PCRE 正規表現構文',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/pcre/pattern.differences.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="reference.pcre.pattern.differences" class="article">
 <h1 class="title">Perl との違い</h1>

 
 <p class="para">
  Perl 5.005 との違いについて以下に説明します。
  <ol type="1">
   <li class="listitem">
    <span class="simpara">
     デフォルトでは、空白文字は C ライブラリ関数 isspace()
     が認識する文字となります。PCRE を別の文字型テーブルを用いて
     コンパイルすることも可能です。通常、isspace() はスペース、改ページ、
     改行、復帰、水平タブ、垂直タブにマッチします。 Perl 5 では、現在、
     垂直タブが空白文字として扱われていません。 Perl ドキュメントには \v
     というエスケープが記載されていましたが、実際は認識されていませんでした。
     ただし、垂直タブ文字は少なくとも 5.002 までは空白文字として
     処理されていました。 5.004 および 5.005 では、\s
     にマッチしなくなっています。
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     PCRE では、先読み言明に量指定子を指定できません。Perl
     では可能ですが、思ったような動作を意味しないかもしれません。
     例えば、(?!a){3} は、続く 3 文字が &quot;a&quot; でないことの言明ではありません。
     この指定は、次の 1 文字が &quot;a&quot; ではないことを 3 回言明するだけです。
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     否定の先読み言明の中に記述したキャプチャ用サブパターンは
     カウントされますが、対応するオフセットにそのエントリは
     セットされません。 Perlでは、言明のマッチングに失敗する前に
     マッチしたパターンからその変数を設定しますが、それが行われるのは、
     否定の先読み言明中の選択肢が 1 つだけの場合のみです。
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     ヌル文字は、検索対象文字列においては使用できますが、
     パターン文字列内では使用できません。これは、パターン文字列が 0
     を終端とする通常の C 文字列として渡されるためです。パターン中では、
     エスケープシーケンス &quot;\x00&quot; を使ってヌル文字を表すことができます。
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     次の Perl エスケープシーケンスはサポートされせん。
     \l, \u, \L, \U。
     これらのエスケープシーケンスは、Perl のパターンマッチエンジン内
     ではなく、文字列処理の部分で実装されているためです。
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     Perl の \G 言明は、単一のパターンマッチに対しては意味がなく、
     サポートされません。
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     当然ながら、PCRE により、(?{code}) 構文および (??{code})
     構文はサポートされません。しかし、再帰的なパターンはサポートしています。
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     Perl 5.005_02 では、パターンの一部を繰り返すと、キャプチャ文字列の
     セットに関して奇妙な動作をすることがあるようです。例えば、&quot;aba&quot;
     を パターン /^(a(b)?)+$/ に対してマッチングを行うと、 $2 には値
     &quot;b&quot; が設定されますが、&quot;aabbaa&quot; を /^(aa(bb)?)+$/ に対して
     マッチングを行うと、$2 はセットされません。
     しかし、パターンを /^(aa(b(b))?)+$/ に変えると、
     $2 (および $3) はセットされます。

     Perl 5.004 では、どちらの場合も $2 はセットされます。 PCRE の場合も、
     どちらの場合でもセットされます。将来的に Perl が矛盾のない状態に
     変更された場合は、PCRE も追従する可能性があります。
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     他の未解決の食い違いとして、パターン /^(a)?(?(1)a|b)+$/ は、
     Perl 5.005_02 では文字列 &quot;a&quot; にマッチしますが、PCRE ではマッチしない
     ということがあります。しかし、Perl と PCRE のいずれでも、/^(a)?a/
     で &quot;a&quot; をマッチした場合は $1 が未定義のままとなります。
    </span>
    </li>
    <li class="listitem">
    <p class="para">
     PCRE では、Perl の正規表現の機能よりさらに拡張された機能を使うことができます。
      <ol type="1">
       <li class="listitem">
        <span class="simpara">
         戻り読み言明は、固定長の文字列にマッチする必要がありますが、
         このとき、戻り読み言明内の選択肢は、それぞれ異なる長さの文字列に
         マッチするパターンとしても問題ありません。Perl 5.005 では
         すべての選択肢が同じ長さである必要があります。
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOLLAR_ENDONLY</a>
        が設定され
        <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_MULTILINE</a>
        が設定されていない場合、メタ文字 $ は文字列の終端にのみ
        マッチします。
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_EXTRA</a>
        を設定すると、バックスラッシュの後に意味がない文字が続くと
        エラーとなります。
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_UNGREEDY</a>
        を設定すると、量指定子の貪欲さが反転します。つまり、量指定子は、
        デフォルトで貪欲でなく、疑問符を後ろに付けてはじめて
        貪欲になるようになります。
       </span>
      </li>
     </ol>
    </p>
   </li>
  </ol>
 </p>
</div>
<?php manual_footer($setup); ?>