=encoding euc-jp
=head1 NAME
X, C, C
=end original この問題に対するもう一つの解決策として、Perl 5.10.0 からは C<$`>, C<$&>, C<$'> と 等価だけれども C
(preseve) 修飾子を伴って実行されたマッチングが 成功した後でのみ定義されることが保証される C<${^PREMATCH}>、 C<${^MATCH}> 及び C<${^POSTMATCH}> を導入しました。 これらの変数の使用は利用したいときに perl に伝える必要がある代わりに、 等価な記号変数とは違い全体的なパフォーマンスの低下を引き起こしません。 Perl 5.20 からこれら三つの変数は C<$`>, C<$&>, C<$'> と等価となり、 C は無視されます。 X X
=head2 Quoting metacharacters
(メタ文字のクォート)
=begin original
Backslashed metacharacters in Perl are alphanumeric, such as C<\b>,
C<\w>, C<\n>. Unlike some other regular expression languages, there
are no backslashed symbols that aren't alphanumeric. So anything
that looks like C<\\>, C<\(>, C<\)>, C<\[>, C<\]>, C<\{>, or C<\}> is
always
interpreted as a literal character, not a metacharacter. This was
once used in a common idiom to disable or quote the special meanings
of regular expression metacharacters in a string that you want to
use for a pattern. Simply quote all non-"word" characters:
=end original
Perl において逆スラッシュで表現されるメタ文字は C<\b>, C<\w>,
C<\n> のように英数字です。
他の正規表現言語とは異なり、英数字でない逆スラッシュ付きシンボルは
ありません。
なので C<\\>, C<\(>, C<\)>, C<\[>, C<\]>, C<\{>, or C<\}> といったものは
全てメタ文字ではなくリテラル文字です。
これはパターンで使いたい文字列の中で正規表現のメタ文字としての特殊な意味を
無効化またはクォートするための一般的な指標として使われてきました。
「単語」でない全ての文字は単にクォートします:
$pattern =~ s/(\W)/\\$1/g;
=begin original
(If C
is put into the special variable C<$^R>. This happens immediately, so
C<$^R> can be used from other C<(?{ code })> assertions inside the same
regular expression.
=end original
スイッチとして使われるかもしれません。
この方法で使われI<なかった>のなら、C の評価結果は特殊変数 C<$^R> に
おかれます。
これはすぐに行われるので C<$^R> は同じ正規表現内の他の C{ code })>
アサーションで使うことができます。
=begin original
The assignment to C<$^R> above is properly localized, so the old
value of C<$^R> is restored if the assertion is backtracked; compare
L"Backtracking">.
=end original
この C<$^R> への設定は適切にlocal化されるため、C<$^R> の古い値は
バックトラックしたときには復元されます; L"Backtracking"> を
見てください。
=begin original
Note that the special variable C<$^N> is particularly useful with code
blocks to capture the results of submatches in variables without having to
keep track of the number of nested parentheses. For example:
=end original
特殊変数 C<$^N> は、一緒にネストしたかっこの数を数えずに一つ前の
マッチング結果を捕捉するコードブロックで特に有用です。
例えば:
$_ = "The brown fox jumps over the lazy dog";
/the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i;
print "color = $color, animal = $animal\n";
=item C<(??{ code })>
X<(??{})>
X X X
=begin original
B: Using this feature safely requires that you understand its
limitations. Code executed that has side effects may not perform
identically from version to version due to the effect of future
optimisations in the regex engine. For more information on this, see
L.
=end original
B<警告>: この機能を安全に使うには、その制限について理解することが必要です。
副作用を持つコードの実行は今後の正規表現エンジンの最適化の影響で
バージョン間で必ずしも同じになるとは限らないでしょう。
これに関するさらなる情報については、L を
参照してください。
=begin original
This is a "postponed" regular subexpression. It behaves in I the
same way as a C<(?{ code })> code block as described above, except that
its return value, rather than being assigned to C<$^R>, is treated as a
pattern, compiled if it's a string (or used as-is if its a qr// object),
then matched as if it were inserted instead of this construct.
=end original
これは「先送りされた」正規部分表現です。
これは上述の C<(?{ code })> コードブロックと I<正確に> 同じように
振る舞いますが、その返り値は、C<$^R> に代入されるのではなく、
パターンとして扱われ、
それが文字列の場合はコンパイルされ(あるいは qr// オブジェクトの場合は
そのまま使われ)、それからこの構文の代わりに挿入されていたかのように
マッチングします。
=begin original
During the matching of this sub-pattern, it has its own set of
captures which are valid during the sub-match, but are discarded once
control returns to the main pattern. For example, the following matches,
with the inner pattern capturing "B" and matching "BB", while the outer
pattern captures "A";
=end original
副パターンのマッチングの間、副マッチングの間有効な独自の捕捉グループを
持ちますが、一旦制御が主パターンに戻ると捨てられます。
例えば、次のマッチングは、内側のパターンで "B" と "BB" にマッチングし、
一方外側のパターンは "A" を捕捉します;
my $inner = '(.)\1';
"ABBA" =~ /^(.)(??{ $inner })\1/;
print $1; # prints "A";
=begin original
Note that this means that there is no way for the inner pattern to refer
to a capture group defined outside. (The code block itself can use C<$1>,
I., to refer to the enclosing pattern's capture groups.) Thus, although
=end original
内側のパターンが外側で定義された捕捉グループを参照する方法は
ないことに注意してください。
(コードブロック自体は、内側のパターンの捕捉グループを参照するために
C<$1> などを使えます。)
従って:
('a' x 100)=~/(??{'(.)' x 100})/
=begin original
I match, it will I set C<$1> on exit.
=end original
これはマッチング I<します> が、終了時に C<$1> は設定 I<されません>。
=begin original
The following pattern matches a parenthesized group:
=end original
次のパターンはかっこで囲まれたグループにマッチングします:
$re = qr{
\(
(?:
(?> [^()]+ ) # Non-parens without backtracking
|
(??{ $re }) # Group with matching parens
)*
\)
}x;
=begin original
See also
L)>|/(?PARNO) (?-PARNO) (?+PARNO) (?R) (?0)>
for a different, more efficient way to accomplish
the same task.
=end original
同じタスクを行う別の、より効率的な方法として
L)>|/(?PARNO) (?-PARNO) (?+PARNO) (?R) (?0)> も
参照してください。
=begin original
Executing a postponed regular expression too many times without
consuming any input string will also result in a fatal error. The depth
at which that happens is compiled into perl, so it can be changed with a
custom build.
=end original
入力を消費しない多すぎる先送りされた正規表現を実行するのも
致命的なエラーとなります。
これが起きる深度は perl にコンパイルされているので、カスタムビルドで
これを変更できます。
=item C<(?I)> C<(?-I)> C<(?+I)> C<(?R)> C<(?0)>
X<(?PARNO)> X<(?1)> X<(?R)> X<(?0)> X<(?-1)> X<(?+1)> X<(?-PARNO)> X<(?+PARNO)>
X X X
X X X
=begin original
Recursive subpattern. Treat the contents of a given capture buffer in the
current pattern as an independent subpattern and attempt to match it at
the current position in the string. Information about capture state from
the caller for things like backreferences is available to the subpattern,
but capture buffers set by the subpattern are not visible to the caller.
=end original
再帰部分パターン。
現在のパターンの与えられた捕捉バッファの内容を独立した
部分パターンとして扱って、
文字列の現在の位置でマッチングしようとします。
後方参照のような呼び出し元からの捕捉状態に関する情報は
部分パターンで利用可能ですが、
部分パターンで設定された捕捉バッファは呼び出し元には見えません。
=begin original
Similar to C<(??{ code })> except that it does not involve executing any
code or potentially compiling a returned pattern string; instead it treats
the part of the current pattern contained within a specified capture group
as an independent pattern that must match at the current position. Also
different is the treatment of capture buffers, unlike C<(??{ code })>
recursive patterns have access to their caller's match state, so one can
use backreferences safely.
=end original
C<(??{ code })> と似ていますが、
コードの実行を伴なわず、返されたパターン文字列をコンパイルもしません;
その代わりに、指定された捕捉グループに含まれる現在のパターンの一部を、
現在の位置でマッチングすべき独立したパターンとして扱います。
また、捕捉バッファの扱いも異なります;
C<(??{ code })> と異なり、再帰パターンはその呼び出し元のマッチング
状態にアクセスすることが出来るので、安全に後方参照を使えます。
=begin original
I is a sequence of digits (not starting with 0) whose value reflects
the paren-number of the capture group to recurse to. C<(?R)> recurses to
the beginning of the whole pattern. C<(?0)> is an alternate syntax for
C<(?R)>. If I is preceded by a plus or minus sign then it is assumed
to be relative, with negative numbers indicating preceding capture groups
and positive ones following. Thus C<(?-1)> refers to the most recently
declared group, and C<(?+1)> indicates the next group to be declared.
Note that the counting for relative recursion differs from that of
relative backreferences, in that with recursion unclosed groups B
included.
=end original
I はその値が再帰させる捕捉グループのかっこ番号を反映する一連の
数字からなります(そして 0 からは始まりません)。
C<(?R)> はパターン全体の最初から再帰します。
C<(?0)> は C<(?R)> の別の構文です。
I の前に正符号または負符号がついていた場合には相対的な位置として
使われます; 負数であれば前の捕捉グループを、正数であれば続く
捕捉グループを示します。
従って C<(?-1)> は一番最近宣言されたグループを参照し、C<(?+1)> は次に
宣言されるグループを参照します。
相対再帰の数え方は相対後方参照とは違って、グループに閉じていない再帰は
含まB<れる>ことに注意してください,
=begin original
The following pattern matches a function C which may contain
balanced parentheses as the argument.
=end original
以下のパターンは引数にバランスのとれたかっこを含んでいるかもしれない関数
C にマッチングします。
$re = qr{ ( # paren group 1 (full function)
foo
( # paren group 2 (parens)
\(
( # paren group 3 (contents of parens)
(?:
(?> [^()]+ ) # Non-parens without backtracking
|
(?2) # Recurse to start of paren group 2
)*
)
\)
)
)
}x;
=begin original
If the pattern was used as follows
=end original
このパターンを以下のように使うと,
'foo(bar(baz)+baz(bop))'=~/$re/
and print "\$1 = $1\n",
"\$2 = $2\n",
"\$3 = $3\n";
=begin original
the output produced should be the following:
=end original
次のように出力されます:
$1 = foo(bar(baz)+baz(bop))
$2 = (bar(baz)+baz(bop))
$3 = bar(baz)+baz(bop)
=begin original
If there is no corresponding capture group defined, then it is a
fatal error. Recursing deeply without consuming any input string will
also result in a fatal error. The depth at which that happens is
compiled into perl, so it can be changed with a custom build.
=end original
もし対応する捕捉グループが定義されていなかったときには致命的な
エラーとなります。
入力を消費しない深い再帰も致命的なエラーとなります。
これが起きる深度は perl にコンパイルされているので、カスタムビルドで
これを変更できます。
=begin original
The following shows how using negative indexing can make it
easier to embed recursive patterns inside of a C construct
for later use:
=end original
以下に後で使うパターンのために、C 構成子内で再帰を埋め込むのに
負数の参照を使うとどのように容易になるかを示します:
my $parens = qr/(\((?:[^()]++|(?-1))*+\))/;
if (/foo $parens \s+ \+ \s+ bar $parens/x) {
# do something here...
}
=begin original
B that this pattern does not behave the same way as the equivalent
PCRE or Python construct of the same form. In Perl you can backtrack into
a recursed group, in PCRE and Python the recursed into group is treated
as atomic. Also, modifiers are resolved at compile time, so constructs
like C<(?i:(?1))> or C<(?:(?i)(?1))> do not affect how the sub-pattern will
be processed.
=end original
B<補足> このパターンは PCRE や Python での等価な形式の構成子と同じように
振る舞うわけではありません。
Perl においては再帰グループの中にバックトラックできますが、PCRE や
Python ではグループへの再帰はアトミックに扱われます。
また、修飾子はコンパイル時に解決されるので、C<(?i:(?1))> や
C<(?:(?i)(?1))> といった構成子はサブパターンがどのように処理されたかに
影響されません。
=item C<(?&NAME)>
X<(?&NAME)>
=begin original
Recurse to a named subpattern. Identical to C<(?I)> except that the
parenthesis to recurse to is determined by name. If multiple parentheses have
the same name, then it recurses to the leftmost.
=end original
名前付きサブパターンへの再帰。
再帰するかっこが名前によって決定される点以外は C<(?I)> と等価です。
もし複数のかっこで同じ名前を持っていた場合には一番左のものに再帰します。
=begin original
It is an error to refer to a name that is not declared somewhere in the
pattern.
=end original
パターンのどこでも宣言されていない名前の参照はエラーになります。
=begin original
B In order to make things easier for programmers with experience
with the Python or PCRE regex engines the pattern C<< (?P>NAME) >>
may be used instead of C<< (?&NAME) >>.
=end original
B<補足:> Python または PCRE 正規表現エンジンに慣れているプログラマが
簡単になるように C<< (?&NAME) >> の代わりに C<< (?P>NANE) >> を使うことも
できます。
=item C<(?(condition)yes-pattern|no-pattern)>
X<(?()>
=item C<(?(condition)yes-pattern)>
=begin original
Conditional expression. Matches C if C yields
a true value, matches C otherwise. A missing pattern always
matches.
=end original
条件付き式。
C が真なら C にマッチングし、さもなければ
C にマッチングします。
パターンがなければ常にマッチングします。
=begin original
C<(condition)> should be one of:
=end original
C<(condition)> は次のいずれかです:
=over 4
=item an integer in parentheses
(かっこでくるまれた数値)
=begin original
(which is valid if the corresponding pair of parentheses
matched);
=end original
(対応するかっこ対がマッチングしたときに有効);
=item a lookahead/lookbehind/evaluate zero-width assertion;
(先読み/後読み/ゼロ幅で評価される言明)
=item a name in angle brackets or single quotes
(角かっこもしくはシングルクォートでくるまれた名前)
=begin original
(which is valid if a group with the given name matched);
=end original
(その名前のグループがマッチングしたときに有効);
=item the special symbol C<(R)>
(特殊なシンボル C<(R)>)
=begin original
(true when evaluated inside of recursion or eval). Additionally the
C<"R"> may be
followed by a number, (which will be true when evaluated when recursing
inside of the appropriate group), or by C<&NAME>, in which case it will
be true only when evaluated during recursion in the named group.
=end original
(再帰または eval 内で評価されているときに真)。
加えて C<"R"> には数字(対応するグループ内で再帰しているときに真)、もしくは
C<&NAME>、こちらの時はその名前のグループで再帰している時にのみ真、を
続けることもできます。
=back
=begin original
Here's a summary of the possible predicates:
=end original
可能な述語の要約を次に示します:
=over 4
=item C<(1)> C<(2)> ...
=begin original
Checks if the numbered capturing group has matched something.
Full syntax: C<< (?(1)then|else) >>
=end original
その番号の捕捉グループが何かにマッチングしたかどうかを調べます。
完全な文法: C<< (?(1)then|else) >>
=item C<(EIE)> C<('I')>
=begin original
Checks if a group with the given name has matched something.
Full syntax: C<< (?()then|else) >>
=end original
その名前のグループが何かにマッチングしたかどうかを調べます。
完全な文法: C<< (?()then|else) >>
=item C<(?=...)> C<(?!...)> C<(?<=...)> C<(?
=begin original
Checks whether the pattern matches (or does not match, for the C<"!">
variants).
Full syntax: C<< (?(?=lookahead)then|else) >>
=end original
パターンがマッチングするか (あるいは C<"!"> 版はマッチングしないか) を
チェックします。
完全な文法: C<< (?(?=lookahead)then|else) >>
=item C<(?{ I })>
=begin original
Treats the return value of the code block as the condition.
Full syntax: C<< (?(?{ code })then|else) >>
=end original
コードブロックの返り値を条件として扱います。
完全な文法: C<< (?(?{ code })then|else) >>
=item C<(R)>
=begin original
Checks if the expression has been evaluated inside of recursion.
Full syntax: C<< (?(R)then|else) >>
=end original
式が再帰の中で評価されているかどうかを調べます。
完全な文法: C<< (?(R)then|else) >>
=item C<(R1)> C<(R2)> ...
=begin original
Checks if the expression has been evaluated while executing directly
inside of the n-th capture group. This check is the regex equivalent of
=end original
式がその n 番目の捕捉グループのすぐ内側で実行されているかどうかを調べます。
これは次のものと等価な正規表現です
if ((caller(0))[3] eq 'subname') { ... }
=begin original
In other words, it does not check the full recursion stack.
=end original
言い換えると、これは完全な再帰スタックを調べるわけではありません。
=begin original
Full syntax: C<< (?(R1)then|else) >>
=end original
完全な文法: C<< (?(R1)then|else) >>
=item C<(R&I)>
=begin original
Similar to C<(R1)>, this predicate checks to see if we're executing
directly inside of the leftmost group with a given name (this is the same
logic used by C<(?&I)> to disambiguate). It does not check the full
stack, but only the name of the innermost active recursion.
Full syntax: C<< (?(R&name)then|else) >>
=end original
C<(R1)> と似ていて、この述語はその名前のつけられている一番左のグループの
すぐ内側で実行されているかどうかをしらべます(一番左は C<(?&I)> と
同じロジックです)。
これは完全なスタックを調べずに、一番内部のアクティブな再帰の名前だけを
調べます。
完全な文法: C<< (?(R&name)then|else) >>
=item C<(DEFINE)>
=begin original
In this case, the yes-pattern is never directly executed, and no
no-pattern is allowed. Similar in spirit to C<(?{0})> but more efficient.
See below for details.
Full syntax: C<< (?(DEFINE)definitions...) >>
=end original
この場合において、yes-pattern は直接は実行されず、no-pattern は
許可されていません。
C<(?{0})> と似ていますがより効率的です。
詳細は次のようになります。
完全な文法: C<< (?(DEFINE)definitions...) >>
=back
=begin original
For example:
=end original
例:
m{ ( \( )?
[^()]+
(?(1) \) )
}x
=begin original
matches a chunk of non-parentheses, possibly included in parentheses
themselves.
=end original
これはかっこ以外からなる固まりかかっこの中にあるそれらにマッチングします。
=begin original
A special form is the C<(DEFINE)> predicate, which never executes its
yes-pattern directly, and does not allow a no-pattern. This allows one to
define subpatterns which will be executed only by the recursion mechanism.
This way, you can define a set of regular expression rules that can be
bundled into any pattern you choose.
=end original
C<(DEFINE)> は特殊な形式で、これはその yes-pattern を直接は実行せず、
no-pattern も許可していません。
これは再帰メカニズムの中で利用することでのみ実行されるサブパターンの
定義を許可します。
これによって、選んだパターンと一緒に正規表現ルールを定義できます。
=begin original
It is recommended that for this usage you put the DEFINE block at the
end of the pattern, and that you name any subpatterns defined within it.
=end original
この使い方において、DEFINE ブロックはパターンの最後におくこと、
そしてそこで定義する全てのサブパターンに名前をつけることが
推奨されています。
=begin original
Also, it's worth noting that patterns defined this way probably will
not be as efficient, as the optimizer is not very clever about
handling them.
=end original
また、この方法によって定義されるパターンはその処理に関してそんなに
賢い訳ではないので効率的でないことに価値は何もないでしょう。
=begin original
An example of how this might be used is as follows:
=end original
これをどのように使うかの例を次に示します:
/(?(?&NAME_PAT))(?(?&ADDRESS_PAT))
(?(DEFINE)
(?....)
(?....)
)/x
=begin original
Note that capture groups matched inside of recursion are not accessible
after the recursion returns, so the extra layer of capturing groups is
necessary. Thus C<$+{NAME_PAT}> would not be defined even though
C<$+{NAME}> would be.
=end original
再帰の内側でマッチングした捕捉グループは再帰から戻った後には
アクセスできないため、余分な捕捉グループの
レイヤは必要な点に注意してください。
従って C<$+{NAME}> が定義されていても C<$+{NAME_PAT}> は定義されません。
=begin original
Finally, keep in mind that subpatterns created inside a DEFINE block
count towards the absolute and relative number of captures, so this:
=end original
最後に、DEFINE ブロックの内側で作られた副パターンは捕捉の絶対及び
相対番号で数えることに注意してください; 従ってこうすると:
my @captures = "a" =~ /(.) # First capture
(?(DEFINE)
(? 1 ) # Second capture
)/x;
say scalar @captures;
=begin original
Will output 2, not 1. This is particularly important if you intend to
compile the definitions with the C operator, and later
interpolate them in another pattern.
=end original
1 ではなく 2 を出力します。
これは、C 演算子で定義をコンパイルして、
後で他のパターンの中で展開することを意図している場合に特に重要です。
=item C<< (?>pattern) >>
X X X X
=begin original
An "independent" subexpression, one which matches the substring
that a I C would match if anchored at the given
position, and it matches I. This
construct is useful for optimizations of what would otherwise be
"eternal" matches, because it will not backtrack (see L"Backtracking">).
It may also be useful in places where the "grab all you can, and do not
give anything back" semantic is desirable.
=end original
「独立した」部分式、I<スタンドアロンの> C がその場所に
固定されてマッチングする部分文字列にマッチングし、
I<その文字列以外にはなにも>マッチングしません。
この構成子は他の"外部"マッチングになる最適化に便利です;
なぜならこれはバックトラックしないためです(L"Backtracking"> 参照)。
これは "できる限りを取り込んで、後は戻らない"セマンティクスが
必要な場所でも便利です。
=begin original
For example: C<< ^(?>a*)ab >> will never match, since C<< (?>a*) >>
(anchored at the beginning of string, as above) will match I
characters C<"a"> at the beginning of string, leaving no C<"a"> for
C to match. In contrast, C will match the same as C,
since the match of the subgroup C is influenced by the following
group C (see L"Backtracking">). In particular, C inside
C will match fewer characters than a standalone C, since
this makes the tail match.
=end original
例: C<< ^(?>a*)ab >> は何もマッチングしません、
なぜなら C<< (?>a*) >> (前述のように、文字列の開始で固定されます)は
文字列のはじめにある全ての文字 C<"a"> にマッチングし、
C のマッチングのための C<"a"> を残さないためです。
対照的に、C は C と同じようにマッチングします、
これはサブグループ C のマッチングは次のグループ C の影響を
受けるためです (L"Backtracking"> 参照)。
特に、C の中の C は単独の C より短い文字にマッチングします;
これによって最後のマッチングが行えるようになります。
=begin original
C<< (?>pattern) >> does not disable backtracking altogether once it has
matched. It is still possible to backtrack past the construct, but not
into it. So C<< ((?>a*)|(?>b*))ar >> will still match "bar".
=end original
C<< (?>pattern) >> は、一旦マッチングしたら、全くバックトラックを
無効にしません。
未だこの構文の前までバックトラックする可能性はありますが、構文の中に
バックトラックすることはありません。
従って C<< ((?>a*)|(?>b*))ar >> は "bar" にマッチングするままです。
=begin original
An effect similar to C<< (?>pattern) >> may be achieved by writing
C<(?=(pattern))\g{-1}>. This matches the same substring as a standalone
C, and the following C<\g{-1}> eats the matched string; it therefore
makes a zero-length assertion into an analogue of C<< (?>...) >>.
(The difference between these two constructs is that the second one
uses a capturing group, thus shifting ordinals of backreferences
in the rest of a regular expression.)
=end original
C<< (?>pattern) >> と似た効果は C<(?=(pattern))\g{-1}> でも達成できます。
これは単独の C と同じ部分文字列にマッチングし、それに続く C<\g{-1}> が
マッチングした文字列を消費します;
これはゼロ幅の言明が C<< (?>...) >> の類似を作るためです。
(この2つの構成子は後者はグループをキャプチャするため、
それに続く正規表現の残りで後方参照の順序をずらす点で違いがあります。)
=begin original
Consider this pattern:
=end original
次のパターンを考えてみてください:
m{ \(
(
[^()]+ # x+
|
\( [^()]* \)
)+
\)
}x
=begin original
That will efficiently match a nonempty group with matching parentheses
two levels deep or less. However, if there is no such group, it
will take virtually forever on a long string. That's because there
are so many different ways to split a long string into several
substrings. This is what C<(.+)+> is doing, and C<(.+)+> is similar
to a subpattern of the above pattern. Consider how the pattern
above detects no-match on C<((()aaaaaaaaaaaaaaaaaa> in several
seconds, but that each extra letter doubles this time. This
exponential performance will make it appear that your program has
hung. However, a tiny change to this pattern
=end original
これは 2 段階までのかっこでくるまれた空でないグループに効率的に
マッチングします。
しかしながら、これはマッチングするグループがなかったときに長い
文字列においてはほとんど永遠に戻りません。
これは長い文字列をいくつかの部分文字列に分解する方法がいくつもあるためです。
これは C<(.+)+> が行うことでもあり、C<(.+)+> は このパターンの
部分パターンと似ています。
このパターンが C<((()aaaaaaaaaaaaaaaaaa> にはマッチングしないことを
どうやって検出するかを少し考えてみましょう、
しかしここでは余計な文字を2倍にしてみます。
この指数的なパフォーマンスはプログラムのハングアップとして表面化します。
しかしながら、このパターンに小さな変更をいれてみます,
m{ \(
(
(?> [^()]+ ) # change x+ above to (?> x+ )
|
\( [^()]* \)
)+
\)
}x
=begin original
which uses C<< (?>...) >> matches exactly when the one above does (verifying
this yourself would be a productive exercise), but finishes in a fourth
the time when used on a similar string with 1000000 C<"a">s. Be aware,
however, that, when this construct is followed by a
quantifier, it currently triggers a warning message under
the C pragma or B<-w> switch saying it
C<"matches null string many times in regex">.
=end original
これは上で行っているように C<< (?>...) >> マッチングを
使っています(これは自身で確認してみるとよいでしょう)が、
しかし 1000000 個の C<"a"> からなる似た文字列を使ってみると、4 分の 1 の
時間で完了します。
しかしながら、この構文は量指定子が引き続くと現在のところ
C プラグマまたは B<-w> スイッチの影響下では
C<"matches null string many times in regex">
(正規表現において空文字列に何回もマッチングしました) という警告を
発するでしょう。
=begin original
On simple groups, such as the pattern C<< (?> [^()]+ ) >>, a comparable
effect may be achieved by negative lookahead, as in C<[^()]+ (?! [^()] )>.
This was only 4 times slower on a string with 1000000 C<"a">s.
=end original
パターン C<< (?> [^()]+ ) >> のような簡単なグループでは、
比較できる影響は C<[^()]+ (?! [^()] )> のように負の先読みの
言明で達することができます。
これは 1000000 個の C<"a"> からなる文字列において 4 倍だけ遅くなります。
=begin original
The "grab all you can, and do not give anything back" semantic is desirable
in many situations where on the first sight a simple C<()*> looks like
the correct solution. Suppose we parse text with comments being delimited
by C<"#"> followed by some optional (horizontal) whitespace. Contrary to
its appearance, C<#[ \t]*> I the correct subexpression to match
the comment delimiter, because it may "give up" some whitespace if
the remainder of the pattern can be made to match that way. The correct
answer is either one of these:
=end original
最初の C<()*> のような正しい解法となる多くの状況において
「できる限りを取り込んで、後は戻らない」セマンティクスが望まれるものです。
任意で(水平)空白の続く C<"#"> によって区切られるコメントのついたテキストの
パースを考えてみます。
その出現と対比して、C<#[ \t]*> はコメント区切りにマッチングする
正しい部分式ではありません; なぜならパターンの残りがそれのマッチングを
作ることができるのならそれはいくつかの空白を「あきらめてしまう」ためです。
正しい回答は以下のいずれかです:
(?>#[ \t]*)
#[ \t]*(?![ \t])
=begin original
For example, to grab non-empty comments into C<$1>, one should use either
one of these:
=end original
例えば空でないコメントを C<$1> に取り込むためには次のいずれかを使います:
/ (?> \# [ \t]* ) ( .+ ) /x;
/ \# [ \t]* ( [^ \t] .* ) /x;
=begin original
Which one you pick depends on which of these expressions better reflects
the above specification of comments.
=end original
選んだ方はコメントの仕様をより適切に反映した式に依存します。
=begin original
In some literature this construct is called "atomic matching" or
"possessive matching".
=end original
いくつかの書籍においてこの構成子は「アトミックなマッチング」
または「絶対最大量マッチング(possessive matching)」と呼ばれます。
=begin original
Possessive quantifiers are equivalent to putting the item they are applied
to inside of one of these constructs. The following equivalences apply:
=end original
絶対最大量指定子はそれが適用されている項目をこれらの構成子の中に置くことと
等価です。
以下の等式が適用されます:
Quantifier Form Bracketing Form
--------------- ---------------
PAT*+ (?>PAT*)
PAT++ (?>PAT+)
PAT?+ (?>PAT?)
PAT{min,max}+ (?>PAT{min,max})
=item C<(?[ ])>
=begin original
See L.
=end original
L を参照してください。
=begin original
Note that this feature is currently L;
using it yields a warning in the C category.
=end original
この機能は現在 L<実験的|perlpolicy/experimental> です;
これを使うと C カテゴリの警告が発生します。
=back
=head2 Backtracking
X X
(バックトラック)
=begin original
NOTE: This section presents an abstract approximation of regular
expression behavior. For a more rigorous (and complicated) view of
the rules involved in selecting a match among possible alternatives,
see L.
=end original
補足: このセクションでは正規表現の振る舞いに関する抽象的な概要を
説明します。
可能な代替におけるマッチングの選択におけるルールの厳密な(そして複雑な)
説明は L を参照してください。
=begin original
A fundamental feature of regular expression matching involves the
notion called I, which is currently used (when needed)
by all regular non-possessive expression quantifiers, namely C<"*">, C<*?>, C<"+">,
C<+?>, C<{n,m}>, and C<{n,m}?>. Backtracking is often optimized
internally, but the general principle outlined here is valid.
=end original
正規表現マッチングの基本的な機能には最近(必要であれば)すべての強欲でない
正規表現量指定子、つまり、
C<"*">, C<*?>, C<"+">, C<+?>, C<{n,m}>, C<{n,m}?> で
使われる I<バックトラッキング> と呼ばれる概念が含まれています。
バックトラックはしばしば内部で最適化されますが、ここで概説する一般的な
原則は妥当です。
=begin original
For a regular expression to match, the I regular expression must
match, not just part of it. So if the beginning of a pattern containing a
quantifier succeeds in a way that causes later parts in the pattern to
fail, the matching engine backs up and recalculates the beginning
part--that's why it's called backtracking.
=end original
正規表現がマッチングする時、その正規表現の一部ではなく、
I<全体> がマッチングしなければなりません。
そのためもしパターンの前半にパターンの後半部分を失敗させてしまう
量指定子が含まれているのなら、マッチングングエンジンはいったん戻って
開始位置を再計算します -- これがバックトラッキングと呼ばれる所以です。
=begin original
Here is an example of backtracking: Let's say you want to find the
word following "foo" in the string "Food is on the foo table.":
=end original
バックトラッキングの例をあげてみます: "Food is on the foo table." という
文字列の中で "foo" に続く単語を取り出してください:
$_ = "Food is on the foo table.";
if ( /\b(foo)\s+(\w+)/i ) {
print "$2 follows $1.\n";
}
=begin original
When the match runs, the first part of the regular expression (C<\b(foo)>)
finds a possible match right at the beginning of the string, and loads up
C<$1> with "Foo". However, as soon as the matching engine sees that there's
no whitespace following the "Foo" that it had saved in C<$1>, it realizes its
mistake and starts over again one character after where it had the
tentative match. This time it goes all the way until the next occurrence
of "foo". The complete regular expression matches this time, and you get
the expected output of "table follows foo."
=end original
マッチングが実行される時、正規表現の最初の部分 (C<\b(foo)>) は開始文字列の
右側で可能なマッチングを探します; そして C<$1> に "Foo" をロードします。
しかし、すぐにマッチングエンジンは C<$1> に保存した "Foo" の後に空白が
無いことを見つけ、それが失敗だったことを検出して仮にマッチングさせた
場所の 1 文字後から開始します。
この時次の "foo" の出現まで進みます。
この時に正規表現は完全にマッチングし、予測した出力 "table follows foo." を
得ます。
=begin original
Sometimes minimal matching can help a lot. Imagine you'd like to match
everything between "foo" and "bar". Initially, you write something
like this:
=end original
最小マッチングが役立つこともあります。
"foo" と "bar" の間の全てにマッチングしたいと考えてください。
最初に、次のように書くかもしれません:
$_ = "The food is under the bar in the barn.";
if ( /foo(.*)bar/ ) {
print "got <$1>\n";
}
=begin original
Which perhaps unexpectedly yields:
=end original
しかしこれは考えたのと違う結果となるでしょう:
got
=begin original
That's because C<.*> was greedy, so you get everything between the
I "foo" and the I "bar". Here it's more effective
to use minimal matching to make sure you get the text between a "foo"
and the first "bar" thereafter.
=end original
これは C<.*> が貪欲であり、そのために I<最初の> "foo" と I<最後の>
"bar" の間にある全てを取り出してしまいます。
次に "foo" とその後の最初の "bar" の間にあるテキストを取り出す
最小マッチングを使ったもっと効率的な方法を示します:
if ( /foo(.*?)bar/ ) { print "got <$1>\n" }
got
=begin original
Here's another example. Let's say you'd like to match a number at the end
of a string, and you also want to keep the preceding part of the match.
So you write this:
=end original
別の例も出してみます。
文字列の最後にある数字にマッチングさせて、そのマッチングの前の部分も
保持させてみましょう。
そしてあなたは次のように書くかもしれません。
$_ = "I have 2 numbers: 53147";
if ( /(.*)(\d*)/ ) { # Wrong!
print "Beginning is <$1>, number is <$2>.\n";
}
=begin original
That won't work at all, because C<.*> was greedy and gobbled up the
whole string. As C<\d*> can match on an empty string the complete
regular expression matched successfully.
=end original
これは全く動作しません、なぜなら C<.*> は貪欲であり文字列全体を
飲み込んでしまいます。
C<\d*> は空の文字列にマッチングできるので正規表現は完全に正常に
マッチングします。
Beginning is , number is <>.
=begin original
Here are some variants, most of which don't work:
=end original
動作しない主なバリエーションをあげておきます:
$_ = "I have 2 numbers: 53147";
@pats = qw{
(.*)(\d*)
(.*)(\d+)
(.*?)(\d*)
(.*?)(\d+)
(.*)(\d+)$
(.*?)(\d+)$
(.*)\b(\d+)$
(.*\D)(\d+)$
};
for $pat (@pats) {
printf "%-12s ", $pat;
if ( /$pat/ ) {
print "<$1> <$2>\n";
} else {
print "FAIL\n";
}
}
=begin original
That will print out:
=end original
これらの結果は次のようになります:
(.*)(\d*) <>
(.*)(\d+) <7>
(.*?)(\d*) <> <>
(.*?)(\d+) <2>
(.*)(\d+)$ <7>
(.*?)(\d+)$ <53147>
(.*)\b(\d+)$ <53147>
(.*\D)(\d+)$ <53147>
=begin original
As you see, this can be a bit tricky. It's important to realize that a
regular expression is merely a set of assertions that gives a definition
of success. There may be 0, 1, or several different ways that the
definition might succeed against a particular string. And if there are
multiple ways it might succeed, you need to understand backtracking to
know which variety of success you will achieve.
=end original
このように、これは幾分トリッキーです。
重要なのは正規表現は成功の定義を定める主張の集合にすぎないことを
認識することです。
特定の文字列で成功となる定義には 0, 1 または複数の違ったやり方が存在します。
そしてもし成功する複数の方法が存在するのなら成功したうちのどれが目的と
するものなのかを知るためにバックトラッキングを理解しておく必要があります。
=begin original
When using lookahead assertions and negations, this can all get even
trickier. Imagine you'd like to find a sequence of non-digits not
followed by "123". You might try to write that as
=end original
前読みの言明及び否定を使っている時にはこれはますますトリッキーになります。
"123" が後ろに続かない数字以外の列を探したいと考えてみてください。
あなたは次のように書くかもしれません。
$_ = "ABC123";
if ( /^\D*(?!123)/ ) { # Wrong!
print "Yup, no 123 in $_\n";
}
=begin original
But that isn't going to match; at least, not the way you're hoping. It
claims that there is no 123 in the string. Here's a clearer picture of
why that pattern matches, contrary to popular expectations:
=end original
ですがこれはマッチングしません; 少なくともなってほしかったようには。
これは文字列の中に 123 がないことを要求します。
よくある予想と比較してなぜパターンがマッチングするのかのわかりやすい
説明を次に示します:
$x = 'ABC123';
$y = 'ABC445';
print "1: got $1\n" if $x =~ /^(ABC)(?!123)/;
print "2: got $1\n" if $y =~ /^(ABC)(?!123)/;
print "3: got $1\n" if $x =~ /^(\D*)(?!123)/;
print "4: got $1\n" if $y =~ /^(\D*)(?!123)/;
=begin original
This prints
=end original
これは次の出力となります
2: got ABC
3: got AB
4: got ABC
=begin original
You might have expected test 3 to fail because it seems to a more
general purpose version of test 1. The important difference between
them is that test 3 contains a quantifier (C<\D*>) and so can use
backtracking, whereas test 1 will not. What's happening is
that you've asked "Is it true that at the start of C<$x>, following 0 or more
non-digits, you have something that's not 123?" If the pattern matcher had
let C<\D*> expand to "ABC", this would have caused the whole pattern to
fail.
=end original
テスト 3 はテスト 1 のより一般的なバージョンなのでそれが失敗すると
考えたかもしれません。
この 2 つの重要な違いは、テスト 3 には量指定子(C<\D*>)が含まれているので
テスト1ではできなかったバックトラッキングを行うことが
できるところにあります。
ここであなたは「C<$x> のはじめで 0 個以上の非数字があるから 123 ではない
何かを得られるんじゃないの?」と聞くでしょう。
このパターンマッチングが C<\D*> を "ABC" に展開させると
これはパターン全体を失敗させることになります。
=begin original
The search engine will initially match C<\D*> with "ABC". Then it will
try to match C<(?!123)> with "123", which fails. But because
a quantifier (C<\D*>) has been used in the regular expression, the
search engine can backtrack and retry the match differently
in the hope of matching the complete regular expression.
=end original
探索エンジンは最初に C<\D*> を "ABC" にマッチングさせます。
そして C<(?!123)> を "123" にマッチングさせ、これは失敗します。
けれども量指定子 (C<\D*>) が正規表現の中で使われているので、探索エンジンは
バックトラックしてこの正規表現全体をマッチングさせるように異なるマッチングを
行うことができます。
=begin original
The pattern really, I wants to succeed, so it uses the
standard pattern back-off-and-retry and lets C<\D*> expand to just "AB" this
time. Now there's indeed something following "AB" that is not
"123". It's "C123", which suffices.
=end original
このパターンは本当に、I<本当に> 成功したいので、これは標準的なパターンの
後退再試行を行い、この時に C<\D*> を "AB" のみに展開させます。
そして確かに "AB" の後ろは "123" ではありません。
"C123" は十分満たしています。
=begin original
We can deal with this by using both an assertion and a negation.
We'll say that the first part in C<$1> must be followed both by a digit
and by something that's not "123". Remember that the lookaheads
are zero-width expressions--they only look, but don't consume any
of the string in their match. So rewriting this way produces what
you'd expect; that is, case 5 will fail, but case 6 succeeds:
=end original
これは言明と否定の両方を使うことで処理することができます。
C<$1> の最初の部分は数字が続きかつそれは "123" ではないことを宣言します。
先読みはゼロ幅の式なのでそれがマッチングした文字列を全く消費しないことを
思い出してください。
そしてこれを必要なものを生成するように書き換えます;
つまり、5 のケースでは失敗し、6 のケースは成功します:
print "5: got $1\n" if $x =~ /^(\D*)(?=\d)(?!123)/;
print "6: got $1\n" if $y =~ /^(\D*)(?=\d)(?!123)/;
6: got ABC
=begin original
In other words, the two zero-width assertions next to each other work as though
they're ANDed together, just as you'd use any built-in assertions: C^$/>
matches only if you're at the beginning of the line AND the end of the
line simultaneously. The deeper underlying truth is that juxtaposition in
regular expressions always means AND, except when you write an explicit OR
using the vertical bar. C means match "a" AND (then) match "b",
although the attempted matches are made at different positions because "a"
is not a zero-width assertion, but a one-width assertion.
=end original
言い換えると、このそれぞれの次にある2つのゼロ幅の言明はちょうど何か組み込みの
言明を使ったかのようにそれらがともに AND されているかのように動作します:
C^$/> は行の始まりで且つ同時に行の終了でる時にのみマッチングします。
もっと深部での真実は、併記された正規表現は垂直線を使って明示的に OR を
書いたとき以外は常に AND を意味します。
C は、"a" がゼロ幅の言明ではなく 1 文字幅の言明なので異なる場所で
マッチングが行われはしますが、 "a" にマッチング且つ(そして) "b" に
マッチングということを意味します。
=begin original
B: Particularly complicated regular expressions can take
exponential time to solve because of the immense number of possible
ways they can use backtracking to try for a match. For example, without
internal optimizations done by the regular expression engine, this will
take a painfully long time to run:
=end original
B<警告>: 特にコンパイルされた正規表現はマッチングのために
できる限りのバックトラックを非常に多くの回数行うので
解くために指数的な時間を必要とすることがあります。
例えば、正規表現エンジンの内部で行われる最適化がなかったときには、次の評価は
尋常じゃないくらい長時間かかります:
'aaaaaaaaaaaa' =~ /((a{0,5}){0,5})*[c]/
=begin original
And if you used C<"*">'s in the internal groups instead of limiting them
to 0 through 5 matches, then it would take forever--or until you ran
out of stack space. Moreover, these internal optimizations are not
always applicable. For example, if you put C<{0,5}> instead of C<"*">
on the external group, no current optimization is applicable, and the
match takes a long time to finish.
=end original
そしてもし内側のグループで 0 から 5 回にマッチングを制限する代わりに
C<"*"> を使うと、永久に、またはスタックを使い果たすまで
実行し続けることになります。
その上、これらの最適化は常にできるわけではありません。
例えば、外側のグループで C<"*"> の代わりに C<{0,5}> を使ったときに、現在の
最適化は適用されません; そしてマッチングが終わるまでの長い時間が
必要になります。
=begin original
A powerful tool for optimizing such beasts is what is known as an
"independent group",
which does not backtrack (see L
pattern) >>>). Note also that
zero-length lookahead/lookbehind assertions will not backtrack to make
the tail match, since they are in "logical" context: only
whether they match is considered relevant. For an example
where side-effects of lookahead I have influenced the
following match, see L pattern) >>>.
=end original
そのような野獣のような最適化のためのパワフルなツールとして
知られているものに、「独立グループ」があります; これはバックトラックを
行いません (L