このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1301067486/290
#  ●正規表現の使用環境 
#  Emacs Lisp 
#   
#  ●検索か置換か? 
#  検索 
#   
#  ●説明 
#  C++などでよく使われる構文にマッチさせたい。 
#  具体的にはクラスインスタンスへのアクセスアローやドットにマッチさせたい。 
#   
#  ●対象データ 
#   
#  class A; 
#  A    a; 
#  A*  a_ref = &a; 
#   
#  a.m_hoge; 
#  a->m_hoge; 
#   
#  ●希望する結果 
#  これにマッチさせる場合 
#  "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z0-9][_a-zA-Z0-9]*\\)?\\)\\=" 
#  が正解らしいですが 
#  なぜ正解かわからない部分があるので教えてください。 
#  まず"?"演算子の使い方ですが・・・直前の文字列(空文字込み)にマッチさせるために置いてあるとして 
#  直後の ":"が理解不能です。 
#  後半でも、":"が出てきますがこれも不可解。名前空間の"::"などにマッチさせたいのであれば 
#  ::や:?:とかならわかるのですが・・ 
#  

'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_文字列,_前文字列,_適合文字列,_後文字列) :-
        atom_chars(_クラス,CharsL),
        sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
        \+((last(L1,C),アルファベット(C))),
        last(L2,';'),
        アローやドットにマッチさせる(ClassL,R2,L2).
'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_文字列,_前文字列,_適合文字列,_後文字列) :-
        atom_chars(_クラス,CharsL),
        sub_atom(_文字列,_,_,_,_,_,_後文字列2,L1,L2,L3),
        \+((last(L1,C),アルファベット(C))),
        last(L2,';'),
        アローやドットにマッチさせる(ClassL,R2,L2),
        'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_後文字列2,_前文字列,_適合文字列,_後文字列).

アローやドットにマッチさせる(ClassL,R2,L2) :-
        append(ClassL,[-,>|R2],L2),
        全てアルファベット(R2).
アローやドットにマッチさせる(ClassL,R2,L2) :-
        append(ClassL,['.'|R2],L2),
        全てアルファベット(R2).

アルファベット(C) :-
        C @>= a,
        C @=< z,!.
アルファベット(C) :-
        C @>= 'A',
        C @=< 'Z',!.
アルファベット(C) :-
        C @>= '0',
        C @=< '9',!.

全てアルファベット([]).
全てアルファベット([C|R]) :-
        アルファベット(C),
        全てアルファベット(R).