このディレクトリの索引

#  いろいろな環境の中には、先読みの否定である (?! ) が
#  使えない環境があります。 このような環境では、
#  「ABC」 という文字列を含まない
#  というような、文字列の否定をする正規表現を作るのは
#  とても難しい作業になります
#  ※ (?! ) が使える環境での作り方は こちら 。
#  
#  では、例として、
#  以下のようなテキストにマッチする正規表現を考えてみましょう★
#  ・ テキストの先頭が AA から始まる
#  ・ テキストの末尾が AA で終わる
#  ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない
#  


'・ テキストの先頭が AA から始まる
・ テキストの末尾が AA で終わる
・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :-
        sub_atom(_テキスト,_,_,_,'AA',S2,'AA',_,_,_),
        \+(sub_atom(S2,_,_,_,'AA')).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :-
        atomic(X),
        atom_chars(A,L),
        atom_chars(X,XL),
        subatom_2(L,S,Len,R,HL,XL,TL),
        atom_chars(H,HL),
        atom_chars(X,XL),
        atom_chars(T,TL).
sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :-
        var(X),
        atom_chars(A,L),
        subatom_2(L,S,Len,R,HL,XL,TL),
        atom_chars(H,HL),
        atom_chars(X,XL),
        \+(XL = []),
        atom_chars(T,TL).

sub_atom_2(L,S,Len,R,L1,XL,L2) :-
        append(L1,XL,L2,L),
        length_cut(L1,S),
        length_cut(L2,R),
        length_cut(XL,Len).

length_cut(L,Len) :-
        length(L,Len),!.