developer tip

.NET의 문자열 끝에서 문자열 자르기-이것이 누락 된 이유는 무엇입니까?

copycodes 2020. 12. 27. 11:17
반응형

.NET의 문자열 끝에서 문자열 자르기-이것이 누락 된 이유는 무엇입니까?


나는 항상 이것이 필요하며 Trim (), TrimStart () 및 TrimEnd () 함수가 문자열을 입력으로 받아들이지 않는다는 사실에 지속적으로 실망합니다. 문자열에 대해 EndsWith ()를 호출하고 다른 문자열로 끝나는 지 확인하지만 끝에서 제거하려면 하위 문자열 해킹을 수행해야합니다 (또는 Remove ()를 호출하고 유일한 사례 ...)

.NET에서이 기본 기능이없는 이유는 무엇입니까? 둘째,이를 구현하는 간단한 방법에 대한 권장 사항 (정규 표현식 경로가 아닌 것이 좋습니다 ...)


TrimEnd()(및 기타 트림 메서드) 트리밍 할 문자를 허용하지만 문자열은 허용하지 않습니다. 전체 문자열을 다듬을 수있는 버전을 정말로 원한다면 확장 메서드를 만들 수 있습니다. 예를 들면 ...

public static string TrimEnd(this string input, string suffixToRemove,
    StringComparison comparisonType) {

    if (input != null && suffixToRemove != null
      && input.EndsWith(suffixToRemove, comparisonType)) {
        return input.Substring(0, input.Length - suffixToRemove.Length);
    }
    else return input;
}

그런 다음 내장 메서드처럼 호출 할 수 있습니다.


편집-편리한 확장 방법으로 포장 :

public static string TrimEnd(this string source, string value)
{
    if (!source.EndsWith(value))
        return source;

    return source.Remove(source.LastIndexOf(value));
}

그래서 당신은 할 수 있습니다 s = s.TrimEnd("DEF");


Daniel의 코드를 사용하고 곧바로 처리하지 않고 잠시 래핑 if하면 Microsoft Trim기능 과 더 유사한 기능이 제공 됩니다.

public static string TrimEnd(this string input, string suffixToRemove)
{
    while (input != null && suffixToRemove != null && input.EndsWith(suffixToRemove))
    {
        input = input.Substring(0, input.Length - suffixToRemove.Length);
    }
    return input;
}

이 빠른 확장 방법을 깨뜨 렸습니다.

긍정적 인 것은 아니지만 (지금은 테스트 할 수 없습니다) 이론은 건전합니다.

    public static string RemoveLast(this string source, string value)
    {
        int index = source.LastIndexOf(value);
        return index != -1 ? source.Remove(index, value.Length) : source;
    }

이 경우 Regex replace가 친구가 될 수 있습니다.

var str = "Hello World!";
str = Regex.Replace(str, @"World!$", "");
//str == "Hello"

저는 TrimEnd가 마지막 문자열뿐만 아니라 끝에있는 문자열의 모든 인스턴스를 제거하는 것을 좋아합니다.

public static string TrimEnd(this string str, string trimStr)
{
    if (string.IsNullOrEmpty(str) || string.IsNullOrEmpty(trimStr)) return str;

    while(str.EndsWith(trimStr))
    {
        str = str.Remove(str.LastIndexOf(trimStr));
    }
    return str;
}

이것이 당신이해야하는 일에 반대하는 것입니까?

if (theString.endsWith(theOtherString))
{
   theString = theString.Substring(0, theString.Length - theOtherString.Length);
}

Trim (), TrimStart () 및 TrimEnd ()는 동일한 문자 의 모든 항목을 대체하는 메서드입니다 . 즉, 일련의 공백 또는 일련의 점만 제거 할 수 있습니다.

이를 수행하기 위해 정규식 바꾸기를 사용할 수 있습니다.

string s1 = "This is a sentence.TRIMTHIS";
string s2 = System.Text.RegularExpressions.Regex.Replace(s1, @"TRIMTHIS$", "");

편의를 위해 확장 메서드로 래핑 할 수 있습니다.

public static string TrimStringEnd(this string text, string removeThis)
{
    return System.Text.RegularExpressions.Regex.Replace(s1, removeThis, "");
}

그리고 이렇게 부르세요

string s2 = (@"This is a sentence.TRIMTHIS").TrimStringEnd(@"TRIMTHIS");

다음은 기존 TrimEnd방법 을 보완하기 위해 (이 질문에 대한 기존 답변에서 가져온 큰 영감) 확장 방법입니다. 선택적 bool을 사용하여 모든 후행 인스턴스 대신 문자열의 후행 인스턴스 하나만 제거 할 수 있습니다.

/// <summary>
/// Removes trailing occurrence(s) of a given string from the current System.String object.
/// </summary>
/// <param name="trimSuffix">A string to remove from the end of the current System.String object.</param>
/// <param name="removeAll">If true, removes all trailing occurrences of the given suffix; otherwise, just removes the outermost one.</param>
/// <returns>The string that remains after removal of suffix occurrence(s) of the string in the trimSuffix parameter.</returns>
public static string TrimEnd(this string input, string trimSuffix, bool removeAll = true) {
    while (input != null && trimSuffix != null && input.EndsWith(trimSuffix)) {
        input = input.Substring(0, input.Length - trimSuffix.Length);

        if (!removeAll) {
            return input;
        }
    }

    return input;
}

.TrimStart("AB".ToCharArray())

최근에 문자열의 시작 / 끝에서 문자열의 단일 또는 여러 인스턴스를 제거하는 고성능 방법이 필요했습니다. 내가 생각 해낸이 구현은 문자열 길이에 O (n)이고 값 비싼 할당을 피 SubString하며 스팬을 사용하여 전혀 호출하지 않습니다 .

Substring해킹이 없습니다 ! (글쎄, 이제 내 게시물을 편집했습니다).

    public static string Trim(this string source, string whatToTrim, int count = -1) 
        => Trim(source, whatToTrim, true, true, count);

    public static string TrimStart(this string source, string whatToTrim, int count = -1) 
        => Trim(source, whatToTrim, true, false, count);

    public static string TrimEnd(this string source, string whatToTrim, int count = -1) 
        => Trim(source, whatToTrim, false, true, count);

    public static string Trim(this string source, string whatToTrim, bool trimStart, bool trimEnd, int numberOfOccurrences)
    {
        // source.IsNotNull(nameof(source));  <-- guard method, define your own
        // whatToTrim.IsNotNull(nameof(whatToTrim));  <-- "

        if (numberOfOccurrences == 0 
            || (!trimStart && !trimEnd) 
            || whatToTrim.Length == 0 
            || source.Length < whatToTrim.Length)
            return source;

        int start = 0, end = source.Length - 1, trimlen = whatToTrim.Length;

        if (trimStart)
            for (int count = 0; start < source.Length; start += trimlen, count++)
            {
                if (numberOfOccurrences > 0 && count == numberOfOccurrences)
                    break;
                for (int i = 0; i < trimlen; i++)
                    if ((source[start + i] != whatToTrim[i] && i != trimlen) || source.Length - start < trimlen)
                        goto DONESTART;
            }

        DONESTART:
        if (trimEnd)
            for (int count = 0; end > -1; end -= trimlen, count++)
            {
                if (numberOfOccurrences != -1 && count == numberOfOccurrences)
                    break;

                for (int i = trimlen - 1; i > -1; --i)
                    if ((source[end - trimlen + i + 1] != whatToTrim[i] && i != 0) || end - start + 1 < trimlen)
                        goto DONEEND;
            }

        DONEEND:
        return source.AsSpan().Slice(start, end - start + 1).ToString();
    }

The following example demonstrates how to extract individual words from a block of text by treating white space and punctuation marks as delimiters. The character array passed to the separator parameter of the String.Split(Char[]) method consists of a space character and a tab character, together with some common punctuation symbols.

string words ="sfdgdfg-121";
string [] split = words.Split(new Char [] {' ', ',', '.', ':', '-' });
foreach (string s in split)
{
    if (s.Trim() != "")              
        Console.WriteLine(s);
}

Try this code.


As far as why the function you want is missing, I suspect it's because the designers didn't see it to be as common or as basic as you think it is. And as you've seen from the other answers, it's an easy enough thing to duplicate.

Here's the method I use to do it.

public static string TrimEnd(string input, string suffixToRemove)
{
    if (input == null)
        throw new ArgumentException("input cannot be null.");
    if (suffixToRemove == null)
        throw new ArgumentException("suffixToRemove cannot be null.");
    int pos = input.LastIndexOf(suffixToRemove);
    if (pos == (input.Length - suffixToRemove.Length))
        return input.Substring(0, pos);
    return input;
}

ReferenceURL : https://stackoverflow.com/questions/7170909/trim-string-from-the-end-of-a-string-in-net-why-is-this-missing

반응형