まずはRubyの正規表現を見ましょう
- プログラム全体は1つのブロックである
- ブロックは0個以上のコマンドの並びであり、コマンドの間や前後には空白を入れてもよい
#コメント
のような#
で始まる行コメントも入れられる#
単体はコメントにならないので注意
- コマンドは以下のものがある。コマンド名は1文字で、それに続いて0個以上の引数がある。コマンド名と引数の間、引数間、最後の引数の後には
/
を入れる。 - 文字列は
/, \, %
のみエスケープできる(\/, \\, \%
)。エスケープのない%
は変数展開に使われることもある(後述)。 - 正規表現はRubyと同じように書ける
以下はa
に対する操作(後述)である。
コマンド | 説明 |
---|---|
c/関数名文字列/ |
関数呼び出し。引数はなくグローバル変数(後述)で渡す。 |
d/関数名文字列/ブロック/ |
関数定義(未検証) |
g/正規表現/置換文字列/ |
a を全置換(RubyのString#gsub)。replace部分に\1などを書いてもただの1になる。正しくは%1 (後述)。 |
m/正規表現/真ブロック/偽ブロック/ |
条件分岐(正規表現がaにマッチするかどうか) |
q/ |
a をエラー出力しプログラムを直ちに異常終了させる(ただしa が空文字列の場合何も出力せず正常終了する) |
s/正規表現/置換文字列/ |
a を置換(String#sub) |
t/置換前文字列/置換後文字列/ |
a を全置換(String#tr) |
w/正規表現/ブロック/ |
a にマッチする間繰り返し(while) |
a
とA
の2つのグローバルな文字列がある- 上のコマンドの最初の文字を大文字にすると
A
に対する操作になる。ただしブロック引数には影響しない。- たとえば
Q/
はA
をエラー出力しプログラムを直ちに異常終了させるのでデバッグに便利
- たとえば
- 関数呼び出しを大文字Cにすると関数の本体の中で
a
とA
が入れ替わる- たとえば下の
c/\//
はna
をna/nA
に置換するが、C/\//
はnA
をnA/na
に置換する
- たとえば下の
- グローバル変数の初期値は
a
が入力全体、A
は空文字列である。プログラム終了時A
が出力される。
- 上のコマンドの最初の文字を大文字にすると
- 正規表現をとるコマンドでは正規表現より右の引数で
%2, %&
等(RubyのKernel特殊変数の正規表現関連の変数の$を%に変えたもの)を使える- ネストする場合は
%%2, %%%%%'
など%の数で深さを指定する。%
を\%
に変えるとただの%と解釈される。
- ネストする場合は
ord
:a
の/^-?\d+(\.\d+)?/
にマッチする部分文字列 (つまり文字列の先頭にある浮動小数点数。以下、これをnaと呼ぶ) をその文字コードを持つ文字に置換chr
:a/^./
をその文字コードに置換+
:na
をna+nA
に置換/
:na
をna/nA
に置換 (-Infinityとかにも置換されうる)