Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

실용모듈개발

간단하지만 실용적인 기능을 구현한 모듈 저작물을 공유하는 공간입니다.

문자열의 (앞/뒤/중간) 공백 없애기

작성자 : 박종명
최초 작성일 : 2008-07-03 (목요일)
최종 수정일 : 2008-07-03 (목요일)
조회 수 : 5204

아주 간단한 유틸리티 성 모듈을 하나 소개합니다.

보통 사용자로 부터 입력을 받는 응용프로그램에서는 입력값의 유효성을 검증할 필요가 있습니다.

그 중에서도 문자열을 입력받을 경우 '공백 제거'가 보편적인 1차 필터링 대상일 경우가 많습니다.

닷넷프레임워크에서는 문자열의 공백을 제거하기 위한 라이브러리를 제공해 주는데요,
String 클래스의 Trim(), RTrim(), LTrim() 메서드가문자열의 공백을 제거 해 주는 역할을 합니다.

그러나 이와같은 String 클래스의 Trim 메서드들은 문자열 '앞/뒤' 의 공백만 제거 해 주기 때문에
문자열 중간중간에 있는 공백을 제거할 수는 없습니다.

따라서 개발자가 필요에 의해 해당 기능을 지원하는 모듈을 만들 필요가 있습니다.


* 문자열의 (앞/뒤/중간) 공백을 없애는 모듈 제작

여러분도 위의 요구사항을 반영해 한번 고민해 보시기 바랍니다.
사실 고민이라는 말이 무색할 정도로 간단하겠지만요...

(생각하는 시간을 가지세요 ^^) ...............................................................

.
.
.
.
.
.
.
.

원리는 아주 간단합니다. 저는 다음의 절차를 따르도록 하였습니다.
(참고로 닷넷 프레임워크 2.0에서 제작되었습니다)

1. 우선 입력받은 문자열의 앞/뒤 공백을 제거한다.
2. 그리고 문자열을 Char 배열로 변환한다.
3. Char배열의 요소를 하나씩 검사하여 공백이 아닌 문자만 뽑아낸다.
4. 이렇게 뽑아낸 문자들을 하나의 문자열로 반환한다.

소스코드는 다음과 같습니다. 

public static string BlankRemove(string inputString)

{

    //우선 앞/뒤 공백을 제거한다

    string value = inputString.Trim();

   

    //공백을 제거한 결과 문자열 저장을 위한 StringBuilder 객체 생성

    System.Text.StringBuilder resultString = new StringBuilder();

 

    //입력받은 문자열을 Char배열로 변환

    char[] chars = value.ToCharArray();

           

    //Char 배열을 돌면서 공백이 아닌 문자만 추출하여 StringBuilder 객체에 추가

    foreach (char c in chars)

    {

        if (c != ' ') resultString.Append(c);

     }

 

    //결과 반환

    return resultString.ToString();

}

 
혹시 Char배열로 만드는게 비 효율적인것 같나요?
다시 말해 다음과 같은 문자열이 입력될 경우,

'  동해             물과                          백두산이마르고닳도록하느님이보우하사우리나라만세무궁화삼철리...'

백두산 이후의 문자열사이에는 공백이 없음에도 불구하고 모두 Char배열로 만들고 검증하는 절차를 거치는 것이
비효율적이라는 생각이 들 수 있습니다.

이럴 경우에는 공백문자를 기준으로 String 배열로 만드는 것도 생각해 볼만 합니다
이렇게 하면 위와 같이 연속된 문자열은 하나의 배열요소로 잡히기 때문에 루프의 횟수를 줄일 수 있겠네요.
(그러나 항상 좋다고는 볼 수 없습니다)

소스코드는 다음과 같습니다. 앞서 코드와 동일한 결과를 반환합니다

public static string BlankRemove(string inputString)

{

    //우선 앞/뒤 공백을 제거한다

    string value = inputString.Trim();

           

    //공백을 제거한 결과 문자열 저장을 위한 StringBuilder 객체 생성

    System.Text.StringBuilder resultString = new StringBuilder();

 

    //입력받은 문자열을 공백문자를 기준으로 String배열로 변환

    string[] arrayString = value.Split(' ');

 

    //String 배열을 돌면서 공백이 아닌 문자만 추출하여 StringBuilder 객체에 추가

    foreach (string s in arrayString)

    {

        if (s != string.Empty) resultString.Append(s);

    }

 

    //결과 반환

     return resultString.ToString();

}

 

이제 모듈 제작이 완성되었으니 이 모듈을 사용하는 클라이언트 측 코드를 작성해 보겠습니다.

 

static void Main(string[] args)

{

    string inputString = "      하세      ~~     ";

 

    Console.WriteLine(String.Format("입력 문자열: {0}",inputString));

    Console.WriteLine(String.Format("입력 문자열 길이: {0}", inputString.Length));

 

    Console.WriteLine("\n문자열에서 공백을 제거합니다\n");

 

    string resultString = BlankRemove(inputString);

 

    Console.WriteLine(String.Format("결과 문자열: {0}", resultString));

    Console.WriteLine(String.Format("결과 문자열 길이: {0}", resultString.Length));

}

 

 

이 코드를 실행하면 다음과 같은 결과가 나옵니다.

 

 

 

이렇게 하여 문자열의 모든 공백을 없애는 모듈을 제작해 보았습니다.
이 글을 보시는 분들 중 많은 분들께서 이 보다 더 좋은 방식으로 해당 문제를 해결할 수 있을 것입니다.
더 좋은 방식이 있다면 저를 위해 그리고 이 글을 보는 많은 분들을 위해 공유해 주시면 감솨하겠습니당~~

그리고 앞서 언급한대로, 위의 샘플은 닷넷 프레임워크 2.0에서 작성되었습니다.
닷넷 프레임워크 상위 버전에서는 새로운 기능을 이용하여 보다 깔끔하게 문제해결이 될 수도 있을 것입니다.
(LINQ를 사용하면 더 깔끔해 지지 않을까요???)



∵Commented by 이희범 at 2008-10-28 오후 4:38:45  
저기...정규식으로 하심이 어떨런지요..

str.replaceAll(" {2,}", "");
이름
비밀번호
홈페이지
LG <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요