なぜこうなった?私は複雑な正規表現を持っていますが、これが私を夢中にさせているものです。
a|b
a
singleまたは single のいずれかに一致しますb
。
a+|b+
a
series ofまたは series ofのいずれかに一致しますb
。
a{1}|b{1}
両方の単一文字に同じように一致します。
しかし、私はこれを行う必要があります:
a{0,2}|b{0,2}
そして、この正規表現は一致するだけa
で、まったく一致しませんb
。それの何がいけないの?
さらにおもしろいのは、 を に変更して0
にすると1
、{1,2}
再び正しく (または期待どおりに) 一致し始めることです。
かなり明確になったので、実際の例を追加します。
my $launch_regexp = '(\d*)d{0,1}(\d*)(\+{0,2}|-{0,2})(\d*)';
($dice, $fc, $op, $mod) = ($launch =~ /$launch_regexp/);
のどこ$launch
が同じです$ARGV[1]
。
いろいろ合わせたい。例:
3 (numbers)
d10 (d + numbers)
3d10 (numbers + d + numbers)
3d10+/-5 (numbers + d + numbers + (+|-) + numbers)
3d10++/--5 (numbers + d + numbers + (++|--) + numbers)
私の正規表現が他の文字列とも一致することはわかっていますが、今で+
は-
.
で範囲を変更すると{1,2}
、+ と - の両方の文字列に一致します (ただし、そのような修飾子を持たない文字列にも一致する必要があります)。
これは、Perl 5.16.3 を搭載した私のマシンで発生しており、この Web サイトで再現できます。