2011年8月28日日曜日

Erlang re replace マッチした文字を置換する Sample サンプル

パターンマッチした文字を置換しようとしていたときのサンプル。
最初にマッチしたものしかできなかった。
エレガントじゃないので、あまり載せたくないけど。

ソース:

-module(re_replace).
-export([start/0,binList_to_list/1]).

%%--------------------------------------------------------------------
%% @doc
%% @spec start() -> list() | error
%% @end
%%--------------------------------------------------------------------
start() ->
    Regexp = ["Erlang"],
    %% compile the Regular Expression
    case re:compile (Regexp) of
{ok,MP} ->
   do_regexp (MP);
{error, ErrSpec} ->
   io:format ("Compile Error ~p~n",[ErrSpec]),
   error
    end.
   
%%--------------------------------------------------------------------
%% @doc
%% @spec do_regexp(MP) -> list() | error
%% @type MP = mp()
%% @end
%%--------------------------------------------------------------------
do_regexp (MP) ->
    Subject = ["My favorite Language is Erlang. Erlang. Erlang."],
    io:format("subject:~p~n",[Subject]),

    case re:run(Subject, MP) of
{match, Captured} ->
   io:format ("match:~p~n",[Captured]),
   Rep = "Ruby",
   io:format("Replace to ~p from \"Erlang\".~n",[Rep]),
   Replace = re:replace(Subject, MP, [Rep]),
   %Tmp = [binary_to_list(X) || X <- Replace],
   %Replace1 = lists:append(Tmp),
   binList_to_list (Replace);
nomatch ->
   io:format ("nomatch~n"),
   error
    end.
%%--------------------------------------------------------------------
%% @doc
%% @spec binList_to_list (list() | binary()) -> list()
%% @end
%%--------------------------------------------------------------------
binList_to_list ([]) ->
    [];
binList_to_list (Lists)
  when is_binary(Lists)
-> binary_to_list(Lists);
binList_to_list (Lists)
  when is_list(Lists)
-> [Head|Tails] = Lists,
  case is_binary(Head) of
      true ->
  HeadStr = binary_to_list(Head),
  HeadStr ++ binList_to_list(Tails);
      false ->
  Head ++ binList_to_list(Tails)
  end.

出力結果:
4> re_replace:start().
subject:["My favorite Language is Erlang. Erlang. Erlang."]
match:[{24,6}]
Replace to "Ruby" from "Erlang".
"My favorite Language is Ruby. Erlang. Erlang."
5> 

今ひらめいた。パターンマッチした文字を全て置換する方法。
今度載せようと思う。

0 件のコメント:

コメントを投稿