2004-03-22 [長年日記]

[Q3] @RegexMatchでキャプチャした部分にアクセス

今の@RegexMatchはマッチしたかどうかしかわからないので、マッチさせたときにキャプチャした文字列も取り出したいという話(BTS:537)。方法としては、

  1. 固定名の変数を使って自動的にそこに代入される(たとえば、$$1から$$nまでとか)
  2. 変数を使うけれども変数名は公開せず、@RegexGet(1)とかでアクセスできるようにする
  3. @RegexMatchの戻り値をBooleanから別の型に変更してその型のオブジェクトに情報を入れておき、専用のマクロで取り出す

くらいが考えられるでしょうか

仕組み的には3が一番ちゃんとしていますが、二つ以上の値を取り出そうとすると変数に代入せざるを得なくなるなど使い勝手的にはいまいちですね。

@Progn(@Set('result', @RegexMatch(%Subject, /regex/)),
       @RegexGet($result, 1),
       @RegexGet($result, 2))

みたいな感じになってしまいます。ひとつの場合でも、

@RegexGet(@RegexMatch(%Subject, /regex/), 1)

のように書く必要があってちょっとわかりにくそうです。

逆に1や2は、@RegexMatchを呼び出すと以前の結果にはアクセスできなくなってしまいます。

1よりは2の方が変更には強そうですが、やっていることは一緒だし、所詮マクロなので書きやすさ重視ということを考えると、1が妥当なところかもしれません。

本日のツッコミ(全1件) [ツッコミを入れる]
# H.Aoyama (2004-03-23 03:57)

そうですね. 1. が一番簡単そうでいい気がします.
よろしくお願いします(^^ゞ.

[]