このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1301067486/563
#  ●正規表現の使用環境 
#  Perl5 or Javascript 
#   
#  ●検索か置換か? 
#  検索 
#   
#  ●説明 
#  ダブルクオートに囲まれた文字列を取得したい 
#  ただ、「\」の次の文字はエスケープされた文字として扱う 
#   
#  ●対象データ 
#  "hogefuga" 
#  "hoge\"fuga" 
#  "hoge\\"fuga" 
#   
#  ●希望する結果 
#  hogefuga 
#  hoge"fuga 
#  hoge\ 
#   
#   
#  上記のようなありきたりな命題にトライしていたのですが、以下の正規表現のうち1ではうまくいくのに2ではうまくいきませんでした 
#  1. /"((?:(?:\\.)|[^"])*)"/ 
#  2. /"((?:[^"]|(?:\\.))*)"/ 
#   
#   
#  ただ、僕にはこれが両方同じ意味に見えるのです 
#   
#  なぜこの場合、2ではうまくいかないのでしょうか 
#  気になって眠れません 
#  詳しい方解説お願いします 
# 
# 

'ダブルクオートに囲まれた文字列を取得したい。ただ、「\\」の次の文字はエスケープされた文字として扱う'(_対象文字列,_前文字列,_適合文字列,_後文字列) :-
        sub_atom(_対象文字列,_,_,_,_前文字列,_,_後文字列,L1,L2,L3),
        sub_atom(_後文字列,0,1,_,'"'),
        sub_atom(_前文字列,_,1,0,'"'),
        '「\\」の次の文字はエスケープされた文字として扱う'(L2,Chars),
        atom_chars(_適合文字列,Chars).

'「\\」の次の文字はエスケープされた文字として扱う'([],[]) :- !.
'「\\」の次の文字はエスケープされた文字として扱う'(['"'|_],_) :- !,fail.
'「\\」の次の文字はエスケープされた文字として扱う'(['\\',A|R1],[A|R2]) :-
        '「\\」の次の文字はエスケープされた文字として扱う'(R1,R2),!.
'「\\」の次の文字はエスケープされた文字として扱う'([A|R1],[A|R2]) :-
        '「\\」の次の文字はエスケープされた文字として扱う'(R1,R2).