Regex Golf( http://regex.alf.nu/ )をプレイしていて、Abbaホールをやっています。私は間違った側面に完全に一致する次の正規表現を持っています(これは私がやろうとしていたことです):
(([\w])([\w])\3\2)
しかし、私はそれを否定しようとしているので、反対側と一致します。私はその部分を理解することができないようです。私は試した:
(?!([\w])([\w])\3\2)
しかし、それはうまくいきませんでした。正規表現マスターからのヒントはありますか?
単に.
および不要な括弧の削除:
^(?!.*(.)(.)\2\1)
単語全体と一致する必要なく、文字列のどの部分にも "abba"(ここでは "abba"は一致しない特定の順序の4文字を意味する)がないことを確認します。
ここでのキーは、先頭のキャレット、^、および。*です。
(?!...)は先読み構造であるため、正規表現処理エンジンは進みません。
/(?! ...)/自体は、式内の式に一致する項目に対して負の結果を正しく返します。 but一致しないアイテムの場合(...)正規表現エンジンは処理を続行します。ただし、正規表現に(?!)のみが含まれている場合、処理するものは何も残っておらず、正規表現の処理位置は前進しません。 (これを参照してください 偉大な答え )。
明らかに、残りの正規表現は空なので、文字列の幅がゼロのセグメントに一致します。つまり、文字列に一致します。
キャレット^が存在する場合、正規表現エンジンは、実際の答えを探していること、および文字列に幅がゼロのコンポーネントが含まれていることを伝えたくないことを認識できます。
したがって、(?!)が成功した場合、正しく一致しないことがあります。
ここの説明を使用: https://stackoverflow.com/a/406408/58466
私は思いついた:^((?!((\w)(\w)\4\3)).)*$