このディレクトリの索引

# 正規表現道場 #388 # 質問させてください。 # OSはubuntu8.04で正規表現を勉強し始めの者です。 # # 電話番号と郵便番号が混在しているテキストファイルから郵便番号だけ # 抽出するという条件なんですが、 # # 郵便番号はxxx-xxxx(xは0-9の数字)、電話番号はxx-xxxx-xxxx(xは0-9の数字) # で、grep -E [0-9]\{3\}-[0-9]\{4\} とやっても電話番号も全て抽出されてしまいます。 # どこが間違っているのでしょうか。 # # 電話番号と郵便番号が混在しているテキストファイルから郵便番号だけ抽出する(_文字列,_前文字列,_郵便番号,_後文字列) :- 副文字列(_文字列,_前文字列,_郵便番号,_後文字列), 郵便番号(_郵便番号), '前文字列の最後の文字と後文字列の最初の文字は数字または"-"であってはならない'(_前文字列,_後文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 郵便番号(_郵便番号) :- '"-"を挟んで前3桁と後4桁に分割する'(_郵便番号,_前3桁,_後4桁), '前3桁と後4桁はともにすべて数字から構成される'(_前3桁,_後4桁). '"-"を挟んで前3桁と後4桁に分割する'(_郵便番号,_前3桁,_後4桁) :- 副文字列(_郵便番号,_前3桁,'-',_後4桁), atom_length(_前3桁,3), atom_length(_後4桁,4). '前3桁と後4桁はともにすべて数字から構成される'(_前3桁,_後4桁) :- '前3桁はすべて数字から構成される'(_前3桁), '後4桁はすべて数字から構成される'(_後4桁). '前3桁はすべて数字から構成される'(_前3桁) :- forall(sub_atom(_前3桁,_,1,_,_数字),数字(_数字)). '後4桁はすべて数字から構成される'(_後4桁) :- forall(sub_atom(_後4桁,_,1,_,_数字),数字(_数字)). 数字(_数字) :- member(_数字,['0','1','2','3','4','5','6','7','8','9']). '前文字列の最後の文字と後文字列の最初の文字は数字または"-"であってはならない'(_前文字列,_後文字列) :- '前文字列の最後の文字は数字または"-"であってはならない'(_前文字列), '後文字列の最初の文字は数字または"-"であってはならない'(_後文字列). '前文字列の最後の文字は数字または"-"であってはならない'(_前文字列) :- \+('前文字列の最後の文字は数字か"-"である'(_前文字列)). '後文字列の最初の文字は数字または"-"であってはならない'(_後文字列) :- \+('後文字列の最初の文字は数字か"-"である'(_後文字列)). '前文字列の最後の文字は数字か"-"である'(_前文字列) :- sub_atom(_前文字列,_,1,0,_最後の文字), '数字か"-"である'(_最後の文字). '後文字列の最初の文字は数字か"-"である'(_後文字列) :- sub_atom(_後文字列,0,1,_,_最初の文字), '数字か"-"である'(_最初の文字). '数字か"-"である'(_文字) :- 数字(_数字). '数字か"-"である'('-').