【正規表現】

なぜ、正規表現は「先読み」部分のサブマッチを保管しない仕様なのでしょうか。

重複した文字列パターンの検索をするプログラムを作成中、
正規表現の先読み部分のサブマッチを利用したくなりました。
仕方なく、マッチ毎に先読み部を含む文字列を切り出してコピーし、
先読み部を改めて解析して必要とする文字列トークンを取り出しました。

もし「先読み」部分のサブマッチを保管すれば、一つの検索対象文字列の同じ部分が複数回サブマッチとして取り上げられる可能性が出てきます。

「後読み(戻り読み)」部分のサブマッチを保管しない理由は直感的に理解できます。
しかし先読み部分のサブマッチは取り出せるようにすべきだと思います。

単に正規表現や先読みの書籍や解説だけ紹介するようなご回答はご遠慮下さい。

「~のようにすればできます!」という解決・回避等の策は歓迎致します。
「その必要はない。質問自体おかしい。~だから。」というご意見は歓迎致します。
過去にそのような議論があったとか、そのURLを添付するようなご回答も歓迎致します。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2011/07/06 13:00:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4974ベストアンサー獲得回数2154

ポイント100pt

括弧を使うので似たようなものだと思いがちですが、先読みも後読みも、対象文字列に対してマッチするのは、長さゼロの文字列だ、と考えると腑に落ちます。


"hogefuga" に対して、肯定先読みの /(?=fuga)/ にマッチするのは、hoge と fuga の間です。

行頭や行末を表す ^ や $ と同じだと考えれば、良いのだそうです。


実は、完全に受け売りで、目からうろこが落ちたのは、↓と、その参照先のページです。

http://d.hatena.ne.jp/ku__ra__ge/20070324/p2


参照先のページはロストしてますが、Internet Archive から 拾えます

--

(追記)

ご本人 (id:ku__ra__ge さん) を呼んでおけば良かったですね。

何か、良いこと書いてくれるかも。

id:jan8

ご回答頂きありがとうございます。

先読み部分のマッチは文字列の境界だという事なんですね。なるほどこれは分かりやすいです。

そして、先読み部分はサブマッチとして拾う為にあるのではないという事も明確です。

先読みに拘らずに、

重複した正規表現マッチの取り出し方を勉強すれば良いような気がしてきました。

2011/06/29 15:52:37
  • id:jan8
    id:ku__ra__ge さんですか。なるほど。
    GGL先生の紹介で既にかなりお世話になっているようです。
    [wsh]VBScript.RegExpは肯定後読みが出来ない
    とか、ハマりどころを見事に教えてくれてました。
  • id:jan8
    a-kuma3様以降回答もなく、悲しいし寂しいし、本質を学びたいのでフクロウ本を中古で買う事にしました。めでたしめでたし。
  • id:a-kuma3
    来てくれませんね >id:ku__ra__ge さん
    週末に期待して、閉じるのは、後、二日ほど待ってみては?
  • id:jan8
    コメントありがとうございます。
    自らは閉じずに、勝手に閉じるまで置いときますよ。

    「詳説 正規表現」のレビューに
    「本質を学ぶと正規表現の捉え方が全く変わる」
    と書いてあるのに賛同し、中古本を買いましたよ(^^)
  • id:a-kuma3
    正規表現の本質、かあ。
    考えたこと無かったな。

    ぼくも読んでみようかなあ。

    少なくとも、正規表現を扱える環境の方が大多数の今では、
    正規表現が分からない (覚える気が無い) やつが作ってくる
    文字列の部分一致を繰り返すようなプログラムには、
    厳しい一言を添えて、突っ返してます。

    # 意外と多いんだな、これが...
  • id:ku__ra__ge
    おっと。IDコールされていたのに気付きませんで失礼しました。
    私のエントリを評価していただいているようで恐縮です。実は私もそんなに正規表現に詳しいわけではないので(^^; たまたま自分が嵌った個所の解決メモがお役にたったのであれば光栄です。
  • id:jan8
    コメント頂きありがとうございます。
    VBScriptで正規表現を使っていたのですが、
    ku__ra__geさんのブログ記事は大変参考になりました。
    他言語の実装間で違いが多いんだなーと実感しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません