Удалите пробелы, используя Erlang Regex - PullRequest
1 голос
/ 12 мая 2009

Я хочу удалить все пробелы, то есть символы табуляции / пробелов / новой строки.

T = {xmlelement,"presence",
                                         [{"xml:lang","en"}],
                                         [{xmlcdata,<<"\n">>},
                                          {xmlelement,"priority",[],
                                              [{xmlcdata,<<"5">>}]},
                                          {xmlcdata,<<"\n">>},
                                          {xmlelement,"c",
                                              [{"xmlns",
                                                "http://jabber.org/protocol/caps"},
                                               {"node","http://psi-im.org/caps"},
                                               {"ver","0.12.1"},
                                               {"ext","cs ep-notify html"}],
                                              []},
                                          {xmlcdata,<<"\n">>}]}.

Я попробовал следующее, но это не работает:

trim_whitespace(Input) ->
re:replace(Input, "(\r\n)*", "").

Ответы [ 4 ]

4 голосов
/ 12 мая 2009

Если вы хотите удалить все в строке, вам нужно передать глобальную опцию re: replace (). Вы также заменяете только новые строки с помощью этого регулярного выражения. Вызов должен выглядеть примерно так:

trim_whitespace(Input) -> re:replace(Input, "\\s+", "", [global]).
2 голосов
/ 25 мая 2012

Я столкнулся с той же проблемой… пришел сюда, чтобы поделиться своей более эффективной работой:

trim(Subject) ->
  {match, [[Trimmed]|_]} = re:run(Subject, "^\\s*([^\\s]*(?:.*[^\\s]+)?)\\s*$", 
    [{capture, all_but_first, binary}, global, dollar_endonly, unicode, dotall]),
  Trimmed.

Идея почти такая же. Регулярное выражение просто лучше.

0 голосов
/ 21 мая 2015

re: replace сложно, что нужно помнить:

Eshell V5.9.3.1  (abort with ^G)
1> re:replace("0 1  2    3 4 5 6 7 8 9", " ", "", [global, {return, list}]).
"0123456789"
2> re:replace("0 1  2    3 4 5 6 7 8 9", " ", "", [{return, list}]).
"01  2    3 4 5 6 7 8 9"
3> re:replace("0 1  2    3 4 5 6 7 8 9", " ", "").
[<<"0">>,[]|<<"1  2    3 4 5 6 7 8 9">>]
0 голосов
/ 13 мая 2009

Все пробелы в вашем вопросе находятся в разделах cdata - почему бы просто не отфильтровать их из кортежа?

remove_cdata(List) when is_list(List) ->
    remove_list_cdata(List);
remove_cdata({xmlelement, Name, Attrs, Els}) ->
    {xmlelement, Name, remove_cdata(Attrs), remove_cdata(Els)}.

remove_list_cdata([]) ->
    [];
remove_list_cdata([{xmlcdata,_}|Rest]) ->
    remove_list_cdata(Rest);
remove_list_cdata([E = {xmlelement,_,_,_}|Rest]) ->
    [remove_cdata(E) | remove_list_cdata(Rest)];
remove_list_cdata([Item | Rest]) ->
    [Item | remove_list_cdata(Rest)].


remove_cdata(T) =:= 
    {xmlelement,"presence",
     [{"xml:lang","en"}],
     [{xmlelement,"priority",[],[]},
      {xmlelement,"c",
       [{"xmlns","http://jabber.org/protocol/caps"},
        {"node","http://psi-im.org/caps"},
        {"ver","0.12.1"},
        {"ext","cs ep-notify html"}],
       []}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...