このディレクトリの索引

#  いろいろな環境の中には、先読みの否定である (?! ) が
#  使えない環境があります。 このような環境では、
#  「ABC」 という文字列を含まない
#  というような、文字列の否定をする正規表現を作るのは
#  とても難しい作業になります
#  ※ (?! ) が使える環境での作り方は こちら 。
#  
#  では、例として、
#  以下のようなテキストにマッチする正規表現を考えてみましょう★
#  ・ テキストの先頭が AA から始まる
#  ・ テキストの末尾が AA で終わる
#  ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない
#  
#  ちなみに、
#  "AAAAA" というテキストの場合、中に挟まれた文字列が
#   A の1文字だけなので、マッチするものとします
#  
#  ▽ マッチさせたいテキストの図
#  
#  このような場合、
#  まず、以下のように正規表現に使えそうなパーツを書き出します
#  ^AA ・・・ テキストの先頭にある AA にマッチする表現
#  AA$ ・・・ テキストの末尾にある AA にマッチする表現
#  A[^A] ・・・ ”A 1文字” の後ろに ”A以外の1文字” が
#            あれば、この2文字にマッチする表現
#  [^A]  ・・・ ”A以外の1文字” にマッチする表現
#  (重要) A[^A] は 2文字 にマッチするということを忘れないで下さい
#  
#  ちなみに、 A[^A] と [^A] は以下のような関係になっています
#  ・ ある文字が A 以外ならば、 [^A] にマッチする
#  ・ ある文字が A であり、次の文字が A 以外ならば、
#   この2文字が A[^A] にマッチする
#  ・ ある文字が AA の A ならば、A[^A] にも [^A] にもマッチしない
#  
#  これを図にすると下のようになります
#  
#  ▽ A[^A] と [^A] の関係図
#  
#  この図を見ると、ある文字にマッチさせるには、
#  A[^A] または [^A] にマッチさせればいいことが分かります
#  
#  つまり、以下のようになります
#  (A[^A]|[^A])
#  
#  そして、これを繰り返せば AA を含まない文字列となります
#  (A[^A]|[^A])*
#  
#  最後に、
#  テキストの先頭と末尾の AA にマッチする表現を付け足し、
#  以下のようにすれば完成・・のはずですね
#  ^AA(A[^A]|[^A])*AA$
#  
#  では、試しに動かしてみましょう!
#  ※ テキストエディタの OtbEdit では ^ と $ が行頭、行末にも
#  マッチするので、1行につき1つのテキストをテストします
#  

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

'・ テキストの先頭が AA から始まる'(_テキスト) :-
        sub_atom(_テキスト,0,_,_,'AA').

'・ テキストの末尾が AA で終わる'(_テキスト) :-
        sub_atom(_テキスト,_,_,0,'AA').

'・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :-
        '・ 先頭の AA と、末尾の AA との間に挟まれた文字列'(_テキスト,_先頭のAAと末尾のAAとの間に挟まれた文字列),
        'の中にはAA が存在しない'(_先頭のAAと末尾のAAとの間に挟まれた文字列).

'・ 先頭の AA と、末尾の AA との間に挟まれた文字列'(_テキスト,_先頭のAAと末尾のAAとの間に挟まれた文字列) :-
        sub_atom(_テキスト,0,Len1,_,'AA'),
        sub_atom(_テキスト,_,Len2,0,'AA'),
        sub_atom(_テキスト,Len1,_,Len2,_先頭のAAと末尾のAAとの間に挟まれた文字列).

'の中にはAA が存在しない'(_先頭のAAと末尾のAAとの間に挟まれた文字列) :-
        \+(sub_atom(_先頭のAAと末尾のAAとの間に挟まれた文字列,_,_,_,'AA')).