C#에서 문자열에 포함된 여러 개의 연속된 공백을 하나의 공백으로 바꾸는 방법은 여러 가지가 있습니다. 대표적으로 String.Replace, String.Join, Regex.Replace 세 가지 방법을 활용할 수 있습니다.
1. String.Replace
String.Replace 메서드는 현재 문자열에서 지정한 유니코드 문자 또는 문자열이 나타나는 모든 부분을 다른 문자나 문자열로 교체한 새 문자열을 반환합니다. 대소문자 구분 여부와 문화권 정보를 함께 지정할 수 있는 Replace(String, String, Boolean, CultureInfo) 오버로드도 제공됩니다.
다만 String.Replace는 정확히 일치하는 문자열만 교체하기 때문에, 연속된 공백의 개수를 미리 알 수 없는 상황에는 적합하지 않습니다.
2. String.Join
String.Join 메서드는 지정된 배열의 요소나 컬렉션의 멤버들을 지정한 구분 기호로 연결하여 하나의 문자열로 만듭니다. Split 메서드와 함께 사용하면 연속된 공백을 효과적으로 정리할 수 있습니다.
3. Regex.Replace
Regex.Replace 메서드는 지정된 입력 문자열에서 정규식 패턴과 일치하는 부분을 찾아 지정된 대체 문자열로 바꿉니다. 정규식 패턴 \s+를 사용하면 탭이나 줄바꿈을 포함한 하나 이상의 연속된 공백 문자를 한 번에 처리할 수 있어 가장 널리 사용되는 방식입니다.
Regex를 활용한 예제
using System;
using System.Text.RegularExpressions;
namespace DemoApplication{
class Program{
public static void Main(){
string stringWithMultipleSpaces = "Hello World. Hi Everyone";
Console.WriteLine($"공백이 여러 개인 문자열: {stringWithMultipleSpaces}");
string stringWithSingleSpace = Regex.Replace(stringWithMultipleSpaces, @"\s+", " ");
Console.WriteLine($"공백이 하나인 문자열: {stringWithSingleSpace}");
Console.ReadLine();
}
}
}실행 결과
공백이 여러 개인 문자열: Hello World. Hi Everyone 공백이 하나인 문자열: Hello World. Hi Everyone
위 예제에서 Regex.Replace는 \s+ 패턴으로 연속된 공백을 식별한 뒤, 이를 단일 공백으로 교체했습니다.
string.Join을 활용한 예제
using System;
namespace DemoApplication{
class Program{
public static void Main(){
string stringWithMultipleSpaces = "Hello World. Hi Everyone";
Console.WriteLine($"공백이 여러 개인 문자열: {stringWithMultipleSpaces}");
string stringWithSingleSpace = string.Join(" ",
stringWithMultipleSpaces.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries));
Console.WriteLine($"공백이 하나인 문자열: {stringWithSingleSpace}");
Console.ReadLine();
}
}
}실행 결과
공백이 여러 개인 문자열: Hello World. Hi Everyone 공백이 하나인 문자열: Hello World. Hi Everyone
위 예제에서는 Split 메서드로 문자열을 공백 기준으로 분리하면서 StringSplitOptions.RemoveEmptyEntries 옵션을 사용해 빈 항목(연속된 공백으로 인해 생기는 빈 문자열)을 제거했습니다. 그런 다음 Join 메서드로 분리된 배열을 단일 공백을 구분 기호로 하여 다시 하나의 문자열로 합쳤습니다.
마무리
간결하고 강력한 처리가 필요하다면 정규식을 사용하는 Regex.Replace 방식이 가장 일반적이며, Split과 Join의 조합을 선호하는 경우 string.Join + Split 방식도 좋은 선택입니다. 대용량 텍스트를 반복적으로 처리해야 한다면, 정규식 객체를 미리 컴파일하여 재사용하거나 StringBuilder를 활용하는 것이 성능 면에서 유리합니다.