2009-05-12 5 views
1

T = {XMLELEMENT, "Präsenz", [{ "xml: lang", "en"}], [{xmlcdata, < < "\ n" >>}, { XMLELEMENT , "Priorität", [], [{xmlcdata, < < "5" >>}]}, { xmlcdata, < < "\ n" >>}, { XMLELEMENT, "c", [{“ xmlns ", " http://jabber.org/protocol/caps "}, {" Knoten "," http://psi-im.org/caps "}, {" ver "," 0.12.1 "}, {"ext", "cs-ep-notify html"}], []}, {xmlcdata, < < "\ n" >>}]}.entfernen Leer mit Erlang Regex

Ich möchte alle Leerzeichen löschen i..e Tabs/Leerzeichen/Zeilenumbruch Zeichen. Ich habe versucht, die folgenden, aber es funktioniert nicht:

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

Antwort

5

Wenn Sie alles in einem String entfernen möchten, müssen Sie die globale Option passieren re: replace(). Sie ersetzen nur neue Zeilen, indem Sie diese Regex verwenden. Der Anruf sollte wohl so aussehen:

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

bekomme ich folgende Fehlermeldung: Sockel: trim_whitespace (P). ** Ausnahmefehler: schlechtes Argument in Funktion re: ersetzen/4 Socket: trim_whitespace (P). ** Ausnahmefehler: schlechtes Argument in Funktion re:/4 als Re genannt replace: ({XMLELEMENT, "Gegenwart", .... –

+0

Sorry, falsch verstanden ich den Mann Seite Meine bearbeiten – mkb

0

die Leerzeichen in Ihrer Frage ist, alle CDATA-Abschnitte - warum nicht nur die aus dem Tupel filtern?

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

Uhr!. Ich möchte, dass alle Zeichen in einer einzigen Zeile erscheinen, damit ich sie an mein Perl-Programm senden kann. Dafür muss ich alle \ r \ n aus dem gesamten Tupel entfernen nach jedem Komma gibt es ein neues Zeilenzeichen.Wie komprimiere ich alles in eine einzige Zeile? –

+0

Sie möchten das Erlang-Tupel in eine Zeichenfolge serialisieren (ohne Zeilenumbrüche/Zeilenumbrüche)? – archaelus

1

stand ich das gleiche Problem ... hergekommen meine effizientere Arbeit zu teilen:

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

Die Idee sehr viel ist das gleiche. Die Regex ist einfach besser.

0

re: ersetzen ist schwierig, etwas im Auge zu behalten:

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">>]