網膜、7バイト
!rm`.*$
単一の正規表現を使用すると、Retinaは一致モードで実行されます。通常、これは単に一致の数!
を印刷しますが、実際の一致を代わりに(改行で区切って)印刷するように構成します。
実際の正規表現は単に.*$
です。改行以外の任意の文字と一致できる.*
ため、任意の行(空の可能性がある)に.
一致します。すぐに行きます$
。
マッチを逆に印刷する方法は?.NETの右から左へのマッチングモードを利用することにより、r
。これは、一致を検索するときに正規表現エンジンが文字列の最後から開始し、逆方向に動作することを意味します。
最後に、m
作る$
試合終了ラインの代わりに、文字列の末尾のを。なぜそれが必要なのでしょうか?問題は、.*
無関係な一致を生成することです。正規表現の置換を検討する
s/a*/$0x/
入力に適用されますbaaababaa
。あなたはこれがもたらすと思うでしょうbaaaxbaxbaax
が、それは実際にあなたに与えますbaaaxxbaxxbaaxx
。どうして?aaa
エンジンのカーソルを一致させた後、a
との間にあるためb
です。これでa
、これ以上sと一致することはできませんa*
が、空の文字列でも満足されます。これは、一致するたびに別の空の一致が得られることを意味します。
追加の空行が導入されるため、ここではそのようなことはしたくないので、一致に次の行の終わりを含めることを要求することにより、これらの無関係な一致(右から左へのモードにより行の先頭にある)を破棄しますこの線。
tac
後続の改行については少し奇妙です。これは、変換a\nb\n
に(後続の改行)b\na\n
とa\nb
に(末尾の改行を)ba\n
。これは私たちのコードがどのように動作するはずですか?