문자열에서 줄 바꿈 문자를 제거하는 방법은 무엇입니까?


181

다음 형식의 문자열이 있습니다

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'

나는 모든 발생 제거 할 \n\r위의 문자열에서합니다.

나는 시도 string s = s.Trim(new char[] {'\n', '\r'});했지만 도움이되지 않았다.

답변:


321

정규식을 사용하고 싶습니다. 이 경우 다음을 수행 할 수 있습니다.

string replacement = Regex.Replace(s, @"\t|\n|\r", "");

정규식은 동적 언어 에서처럼 .NET 세계에서 인기가 없지만 문자열을 조작하는 데 많은 힘을 제공합니다.


이것은 확실히 나에게 가장 좋은 해결책이었습니다. 이 C #과 자바 스크립트의 매끄러운 조화는 내 문제를 해결하는 데 필요한 전부였습니다.
Joe Brunscheon

문자열에서 줄 바꿈을 제거 해야하는 비슷한 문제가있었습니다. 문자열로 시도했지만 교체하지 못했습니다. Regex.Replace를 매개 변수와 정확히 동일한 정규 표현식 문자열로 사용했을 때 작동했습니다. 감사.
instance

8
1M + 항목을 처리하는 루프에서 이것을 사용할 경우주의하십시오. 정규 표현식은 문자열보다 속도가 느립니다. 교체
Nick

이 코드 예제는 문제가없는 \ t 탭을 제거합니다.
Michael Freidgeim

71

String.Replace캐릭터를 제거하는 데 사용하려고합니다 .

s = s.Replace("\n", String.Empty);
s = s.Replace("\r", String.Empty);
s = s.Replace("\t", String.Empty);

String.Trim(params char[] trimChars)에서만 선행 및 후행 문자를 제거 trimChars인스턴스가 호출에서.

확장 메소드를 작성하면 많은 임시 문자열을 작성하는 위의 성능 문제를 피할 수 있습니다.

static string RemoveChars(this string s, params char[] removeChars) {
    Contract.Requires<ArgumentNullException>(s != null);
    Contract.Requires<ArgumentNullException>(removeChars != null);
    var sb = new StringBuilder(s.Length);
    foreach(char c in s) { 
        if(!removeChars.Contains(c)) {
            sb.Append(c);
        }
    }
    return sb.ToString();
}

8
이 접근 방식은 두 개의 중간 문자열 객체를 생성합니다. 문자열의 크기에 따라 상당한 성능과 메모리 소비 결과가 발생할 수 있습니다.
cdhowie

40

나는 이것이 오래된 게시물이라는 것을 알고 있지만 줄 바꿈 문자를 제거하는 데 사용하는 방법을 공유한다고 생각했습니다.

s.Replace(Environment.NewLine, "");

참고 문헌 :

MSDN String.Replace 메서드MSDN Environment.NewLine 속성


모노 지원에 적합
Nick

1
교차 환경 (예 : Unix 시스템의 데이터가 제공되는 Windows 앱) 응용 프로그램에서는 이윤보다 더 많은 문제가 발생합니다.
Jakub Szułakiewicz 2016 년

15

속도와 낮은 메모리 사용이 중요한 경우 다음과 같이하십시오.

var sb = new StringBuilder(s.Length);

foreach (char i in s)
    if (i != '\n' && i != '\r' && i != '\t')
        sb.Append(i);

s = sb.ToString();

예, 확장 방법으로도 함께 갈 것입니다. 항상 StringBuilder를 사용하는 것이 좋습니다. +1
RPM1984

4
"항상 StringBuilder를 사용하는 것이 좋습니다"<나는 프로가 아니지만 엄격하게 사실이 아닙니다. Jeff Atwood 의이 기사 는 문자열 조작 / 연결 및 궁극적으로 최적화에 대한 재미있는 통찰력을 제공합니다.
Phil Cooper


3

LINQ 접근 방식 :

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'";

string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t'));

1
이것은 일반적인 오버로드를 사용 하여 쿼리에서 반환 된 각각 string.Join을 호출 합니다. 쿼리 결과를 생성자 에게 전달하는 것이 좋습니다. ToStringcharstrings1 = new string(s.Where(....).ToArrary());
juharr

0

올바른 선택은 실제로 입력 문자열의 크기와 perforce 및 메모리 요구 사항에 달려 있지만 다음과 같은 정규 표현식을 사용합니다.

string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);

또는 동일한 교체를 여러 번 적용 해야하는 경우 정규식에 대해 컴파일 된 버전을 사용하는 것이 좋습니다

var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
string result = regex.Replace(s, String.Empty);

참고 : 각기 다른 시나리오는 최상의 성능과 최소 메모리 소비를 달성하기 위해 다른 접근 방식을 필요로합니다.


0

글쎄 .. 좀 더 구체적인 공간 영역을 이해하고 싶습니다 \t실제로는 수직 공간이 아닌 수평 공간으로 분류됩니다. ( \t메모장에 삽입 하여 테스트 )

Java를 사용하는 경우을 사용하십시오 \v. 아래 참조를 참조하십시오.

\h -수평 공백 문자 :

[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

\v -수직 공백 문자 :

[\n\x0B\f\r\x85\u2028\u2029]

그러나 .NET을 사용하고 있음을 알고 있습니다. 모든 수직 공간을 교체하는 것에 대한 나의 대답은

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");

그것은 ... 다른 질문에 대한 답변처럼 보이는 ... 또한 실제 참조가없는
알렉세이 Levenkov에게

-4

Trim시작과 끝에서 제거하려는 경우 사용할 수 있습니다 .

string stringWithoutNewLine = "\n\nHello\n\n".Trim();

-6

참고로,

Trim ()은 이미 그렇게합니다.

다음 LINQPad 샘플 :

void Main()
{
    var s = " \rsdsdsdsd\nsadasdasd\r\n ";
    s.Length.Dump();
    s.Trim().Length.Dump();
}

출력 :

23
18

5
그것은 중간에 \ n을 제거하지 않습니다.
FlappySocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.