2012-10-09 14 views
8

Wiem, że istnieje ciąg: strip in erlang. Ale jego zachowanie jest dla mnie dziwne.Jak usunąć wszystkie puste znaki w ciągu znaków w Erlangu?

A = " \t\n" % two whitespaces, one tab and one newline 
string:strip(A) % => "\t\n" 
string:strip(A,both,$\n) % string:strip/3 can only strip one kind of character 

I potrzebuję funkcję, aby usunąć wszystkie prowadzące/końcowe puste znaki, w tym spacji, \ t \ n \ r itp

some_module:better_strip(A) % => [] 

Czy Erlang nie jedna funkcja może to zrobić? Albo jeśli muszę to zrobić sam, jaki jest najlepszy sposób?

+0

Nie jest "dziwny", udokumentowano, że tylko przycina * puste miejsca * aka: http://erlang.org/doc/man/string.html#strip-1. – Tommy

Odpowiedz

14

Spróbuj:

re:replace(A, "(^\\s+)|(\\s+$)", "", [global,{return,list}]). 
6

Spróbuj budowę:

re:replace(A, "\\s+", "", [global,{return,list}]). 

Przykładowa sesja

Erlang R15B01 (erts-5.9.1) [source] [async-threads:0] [hipe] [kernel-poll:false] 

Eshell V5.9.1 (abort with ^G) 
1> A = " 21\t\n ". 
" 21\t\n " 
2> re:replace(A, "\\s+", "", [global,{return,list}]). 
"21" 

UPDATE

Otrzymany roztwór będzie zdrapanie Oznaczenia wewnątrz łańcucha też (nie tylko prowadzenie i tailing).

Jeśli trzeba rozebrać tylko wiodącym i ogonów, można użyć coś takiego:

re:replace(re:replace(A, "\\s+$", "", [global,{return,list}]), "^\\s+", "", [global,{return,list}]). 

Przykład sesji:

Erlang R15B01 (erts-5.9.1) [source] [async-threads:0] [hipe] [kernel-poll:false] 

Eshell V5.9.1 (abort with ^G) 
1> A=" \t \n 2 4 \n \t \n ". 
" \t \n 2 4 \n \t \n " 
2> re:replace(re:replace(A, "\\s+$", "", [global,{return,list}]), "^\\s+", "", [global,{return,list}]). 
"2 4" 
+1

Spowoduje to również usunięcie spoza przedniego/końcowego spacji. – Tilman

+1

Tak. Jeśli chcesz usunąć tylko symbole wiodące i końcowe, możesz użyć dwóch konstrukcji: "re: replace (A,"^\\ s + "," ", [global, {return, list}])." i "re: replace (A," \\ s + $ "," ", [globalny, {return, list}])." – fycth

0

Używanie wbudowana funkcja: string:strip/3, możesz mieć ogólną abstrakcję

 
clean(Text,Char)-> string:strip(string:strip(Text,right,Char),left,Char). 
Można go użyć w następujący sposób:

 
Microsoft Windows [Version 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

C:\Windows\System32>erl 
Eshell V5.9 (abort with ^G) 
1> Clean = fun(Text,Char) -> string:strip(string:strip(Text,right,Char),left,Char) end. 
#Fun<erl_eval.12.111823515> 
2> Clean(" Muzaaya ",32). 
"Muzaaya" 
3> Clean("--Erlang Programs--",$-). 
"Erlang Programs" 
4> Clean(Clean("** WhatsApp Uses Erlang and FreeBSD in its Backend ",$*),32). 
"WhatsApp Uses Erlang and FreeBSD in its Backend" 
5> 

To jest czysty sposób i ogólny. Char musi być wartością ASCII.

+0

Dzięki. Ale znam to i piszę, dlaczego nie używam go w pytaniu. – halfelf

Powiązane problemy