web-dev-qa-db-ja.com

正規表現の否定?

Regex Golf( http://regex.alf.nu/ )をプレイしていて、Abbaホールをやっています。私は間違った側面に完全に一致する次の正規表現を持っています(これは私がやろうとしていたことです):

(([\w])([\w])\3\2)

しかし、私はそれを否定しようとしているので、反対側と一致します。私はその部分を理解することができないようです。私は試した:

(?!([\w])([\w])\3\2)

しかし、それはうまくいきませんでした。正規表現マスターからのヒントはありますか?

16
Lester Peabody

単に.および不要な括弧の削除:

^(?!.*(.)(.)\2\1)

単語全体と一致する必要なく、文字列のどの部分にも "abba"(ここでは "abba"は一致しない特定の順序の4文字を意味する)がないことを確認します。

23
Jerry

ここでのキーは、先頭のキャレット、^、および。*です。

(?!...)は先読み構造であるため、正規表現処理エンジンは進みません。

/(?! ...)/自体は、式内の式に一致する項目に対して負の結果を正しく返します。 but一致しないアイテムの場合(...)正規表現エンジンは処理を続行します。ただし、正規表現に(?!)のみが含まれている場合、処理するものは何も残っておらず、正規表現の処理位置は前進しません。 (これを参照してください 偉大な答え )。

明らかに、残りの正規表現は空なので、文字列の幅がゼロのセグメントに一致します。つまり、文字列に一致します。

[スワッグ開始]

キャレット^が存在する場合、正規表現エンジンは、実際の答えを探していること、および文字列に幅がゼロのコンポーネントが含まれていることを伝えたくないことを認識できます。

[スワッグ終了]

したがって、(?!)が成功した場合、正しく一致しないことがあります。

2
inquist

ここの説明を使用: https://stackoverflow.com/a/406408/58466

私は思いついた:^((?!((\w)(\w)\4\3)).)*$

2
Bill