このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/233
#  
#  ●Regular Expressionの使用環境 
#  秀丸 8.2.1 
#  ●検索か置換か? 
#  置換 
#  
#  ●説明 
#  二つ目のTab以降を削除したいです。
#  
#  ●対象データ 
#  100 こくご えいご 100 20 固定 
#  共通 シャカイ スウガク 100 10 ランダム 
#  
#  (データの間の空白は全部Tabです) 
#  
#  ●希望する結果 
#  100 こくご 
#  共通 すうがく 
#  
#  
#  下の正規表現で試してみました。 
#  ^(.*)?\t(.*)?\t[あ-ん ア-ン].* 
#  \1\t\2 
#  (.*)?\t(.*)?\tでTabまでの最短マッチ(のつもり)二つで、えいご、スウガクまでを指定しています。 
#  
#  3つめのカラムの1文字目がひらがなとカタカナなので、[あ-ん ア-ン]で指定しているのですが、 
#  後ろの"ランダム"がマッチしてしまい、2行目が下のような結果になってしまいます。 
#  
#  100 こくご 
#  共通 シャカイ スウガク 100 10 
#  
#  やり方教えて貰えればうれしいです。 
#  よろしくお願いします。 
#  


'二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :-
        atom_chars(_文字列,Chars),
        '二つ目のTab以降を削除したいです。'(Chars,['\t','\t'],_二つ目のTab以降を削除後の文字ならび),
        atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび).

'二つ目のTab以降を削除したいです。'([A|_二つめのTab以降],[A],[A]) :- !.
'二つ目のTab以降を削除したいです。'([A|R1],[A|R2],[A|R3]) :-
        '二つ目のTab以降を削除したいです。'(R1,R2,R3).
'二つ目のTab以降を削除したいです。'([B|R1],L2,[B|R3]) :-
        '二つ目のTab以降を削除したいです。'(R1,L2,R3).

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

'二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :-
        atom_chars(_文字列,Chars),
        '一文字ずつ最初のTabが来るまで'(Chars,_Tabまでの文字ならび,_残り文字ならび_1),
        '二個目のTabが来るまで'(_残り文字ならび_1,_二個目のTabまでの文字ならび),
        append(_Tabまでの文字ならび,_二個目のTabまでの文字ならび,_二つ目のTabまでの文字ならび),
        atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTabまでの文字ならび).

'一文字ずつ最初のTabが来るまで'(['\t'|_残り文字ならび],['\t'],_残り文字ならび) :- !.
'一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび) :-
        '一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび),!.

'二個目のTabが来るまで'(['\t'|_],['\t']) :- !.
'二個目のTabが来るまで'([A|R1],[A|R2]) :-
        '二個目のTabが来るまで'(R1,R2).

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

'二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :-
        文字ならびに変換する(_文字列,_文字ならび),
        二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで),
        文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列).

文字ならびに変換する(_文字列,_文字ならび) :-
        atom_chars(_文字列,_文字ならび).

二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで) :-
        append(L1,['\t'|R2],['\t'|_],_文字ならび).

文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列) :-
        append(_最初のTabまで,['\t'|_その後二つめのTabまで],['\t'],_二つ目のTab以降を削除後の文字ならび),
        atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび),!.

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

'二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :-
        最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列),
        それ以後の文字列の最初に現れたTabを含めた長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ),
        _長さ is _最初のTabを含めたそこまでの文字列の長さ + _それ以後の文字列の最初に現れたTabを含めた長さ,
        sub_atom(_文字列,0,_長さ,_,_二つ目のTab以降を削除後の文字列),!.


最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列) :-
        sub_atom(_文字列,St1,1,R,'\t'),
        _最初のTabを含めたそこまでの文字列の長さ is St1 + 1,
        sub_atom(_文字列,_最初のTabを含めた文字列の長さ,R,0,_それ以後の文字列).

それ以後の文字列の最初に現れたTabを含めた最初からの長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ) :-
        sub_atom(_それ以後の文字列,St,1,_,'\t'),
        _それ以後の文字列の最初に現れたTabを含めた長さ is St + 1,!.