2004-04-15 [長年日記]

[Q3] ^とか$とか

正規表現続きで、^とか$あたりを。ゼロ幅のマッチということで、一緒に\A, \Z, \z, \b, \Bも入れてみました。さらに^や$は、複数行モードかどうかで動作を変える必要があるので複数行モードも追加して、一緒に「.」が行末文字にマッチするかどうかも指定できるようにしました。

モードはマクロからしか指定できませんが、

/foo\n^bar/m
/.*/s
/foo.^bar/ms

のように指定します。/mにすると複数行モードになり、/sを付けると「.」が行末文字にマッチするようになります。デフォルトでは単数行モード($と^はパターン全体の最初と最後にマッチ)で、「.」は行末文字にはマッチしません。

ちなみに行末文字は、CR, LF, \u0085, \u2028, \u2029です。

ついでですが、(?:)も使えるようにしてしまいました。

[Q3] 前方参照か後方参照か

結局のところ、"Back reference"をなんと訳したかという問題で、前方「を」参照なのか、後方「で」参照なのかということですね。私はオライリーの正規表現の本にならって前方参照と呼んでいます*1

Microsoftにいたっては、JScriptでは後方参照だったのが、JScript.NETでは前方参照に変わっていたりして。

おおよそ、Javaや.NET方面では前方参照で、PerlやRuby方面では後方参照と呼ばれていることが多いようです。さらに、Perl方面では幅ゼロの先読み(lookahead assertion)を前方参照と訳しているところもあって混乱していますね。

ちなみに、前方参照とは正規表現中でそこに到達したときにそれ以前にあるグループがマッチした文字列に対してマッチさせる構文です。たとえば、

([a-z])\1

とすると、aaやbbにはマッチするけれど、abにはマッチしないというような感じです。

*1  でも実はこの本の中でも後方参照と書かれているところがあって正誤表が出ています

本日のツッコミ(全2件) [ツッコミを入れる]
# H.Aoyama (2004-04-15 19:57)

なんだか正規表現回りがすごいスピードでパワーアップされていますね. ^と$ は日頃なんとなく使う事があるので,実装されたのは嬉しいです.
ただ..不勉強で恥ずかしいんですが,「前方参照」とか「後方参照」ってのが今一つクリアに理解出来て無いです.
\(\) によるグルーピングを \1,\2 で取り出していくことなのかな?と思ったんですが,それで有ってるんでしょうか? (因みに,「前方」?「後方」? google に聞いてみても今一つはっきりしなくて...)

# H.Aoyama (2004-04-16 16:38)

説明,ありがとうございました. なんかようやくすっきりしたって感じです.

#にしても,説明が突っ込みでなく本文だったので恐縮しちゃいました(^^ゞ

[]