2

なぜこうなった?私は複雑な正規表現を持っていますが、これが私を夢中にさせているものです。

a|b

asingleまたは single のいずれかに一致しますb

a+|b+

aseries 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 サイトで再現できます。

4

2 に答える 2

7

文字列「b」は、「a」a{0,2}のインスタンスが正しくないため、正規表現で一致させることができます。キャプチャしませんが、一致します。

''、'aa' または 'bb' に一致させるには、正規表現全体を and でラップする必要があり(aa|bb)?ます^$

ソリューションに必要なものは次のとおりだと思います。(\d*)d?(\d+)(?:(\+{1,2}|\-{1,2})(\d*))?

于 2013-10-08T21:37:54.213 に答える
2

Perl は、文字列内で最も早い一致を優先します。次に、一連の|選択肢の中で最も早いものを優先します (一部の正規表現エンジンの場合のように、最も長いものではありません)。最初の選択肢は何にも一致しないため、perl は a で始まらないすべての文字列に対して、文字列の先頭でこれを行います。

おそらく次のようなものが必要です。

my ($find) = ($string) =~ /^[^ab]*(a{1,2}|b{1,2}|\z)/;
于 2013-10-08T22:10:10.073 に答える