2009-05-12 15 views
1

T = {xmlelement, "présence", [{ "xml: lang", "en"}], [{xmlcdata, < < "\ n" >>}, { xmlelement , "priorité", [], [{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" >>}]}.utilisant Erlang Supprimer les espaces Regex

Je souhaite supprimer tous les espaces/tabulations/espaces/caractères de nouvelle ligne. J'ai essayé ce qui suit, mais il ne fonctionne pas:

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

Répondre

5

Si vous souhaitez supprimer tout dans une chaîne, vous devez passer l'option globale de re: REPLACE(). Vous ne remplacez également les nouvelles lignes qu'en utilisant cette expression régulière. L'appel devrait probablement ressembler à ceci:

trim_whitespace(Input) -> re:replace(Input, "\\s+", "", [global]). 
+0

Je reçois l'erreur suivante: socket: trim_whitespace (P). ** erreur d'exception: mauvais argument dans la fonction re: replace/4 socket: trim_whitespace (P). ** erreur d'exception: mauvais argument dans la fonction re: remplacer/4 appelé comme re: remplacer ({xmlelement, "présence", .... –

+0

Désolé, j'ai mal lu la page de manuel! Voir mon édition – mkb

0

tous les espaces dans votre question dans les sections CDATA - pourquoi pas seulement filtrer ceux de la tuple?

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"}], 
     []}]} 
+0

am Je cherche à supprimer tous les caractères \ r \ n Je veux que cela apparaisse sur une seule ligne pour que je puisse l'envoyer à mon programme perl Pour cela, j'ai besoin de retirer tout le \ r \ n de tout le tuple. après chaque virgule, il y a un nouveau caractère de ligne Comment est-ce que je compresse tout en une seule ligne? –

+0

Vous voulez sérialiser ce tuple erlang en une chaîne (sans retours chariot/retour chariot)? – archaelus

1

Je face à la même question ... est venu ici pour partager mon travail plus efficace:

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

L'idée est très bien même. L'expression rationnelle est juste meilleure.

0

re: remplacer est délicat, quelque chose à garder à l'esprit:

Eshell V5.9.3.1 (abort with ^G) 
1> re:replace("0 1 2 3 4 5 6 7 8 9", " ", "", [global, {return, list}]). 
"" 
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">>] 
Questions connexes