C # 문자열에서 여러 문자 바꾸기 놀랐습니다. 나는 내 자신의

문자열을 바꾸는 더 좋은 방법이 있습니까?

Replace가 문자 배열이나 문자열 배열을 사용하지 않는다는 것에 놀랐습니다. 나는 내 자신의 확장을 작성할 수 있다고 생각하지만 다음을 수행하는 더 나은 방법이 있는지 궁금합니다. 마지막 바꾸기는 문자가 아닌 문자열입니다.

myString.Replace(';', '\n').Replace(',', '\n').Replace('\r', '\n').Replace('\t', '\n').Replace(' ', '\n').Replace("\n\n", "\n");



답변

정규식 바꾸기를 사용할 수 있습니다.

s/[;,\t\r ]|[\n]{2}/\n/g
  • s/ 처음에는 검색을 의미합니다
  • [와 사이의 문자] (임의의 순서로) 검색 할 문자입니다
  • 두 번째 /는 검색 텍스트와 대체 텍스트를 구분합니다

영어로 다음과 같이 읽습니다.

;또는 ,또는 \t또는 \r또는 (공백) 또는 정확히 두 개의 순차 \n를 검색하여 \n

C #에서 다음을 수행 할 수 있습니다. (가져 오기 후 System.Text.RegularExpressions)

Regex pattern = new Regex("[;,\t\r ]|[\n]{2}");
pattern.Replace(myString, "\n");


답변

당신이 특히 영리하다고 느끼고 정규식을 사용하고 싶지 않은 경우 :

char[] separators = new char[]{' ',';',',','\r','\t','\n'};

string s = "this;is,\ra\t\n\n\ntest";
string[] temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries);
s = String.Join("\n", temp);

약간의 노력으로 확장 방법으로 이것을 감쌀 수 있습니다.

편집 : 또는 2 분 정도 기다리면 어쨌든 작성하게됩니다. 🙂

public static class ExtensionMethods
{
   public static string Replace(this string s, char[] separators, string newVal)
   {
       string[] temp;

       temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries);
       return String.Join( newVal, temp );
   }
}

그리고 짜잔 …

char[] separators = new char[]{' ',';',',','\r','\t','\n'};
string s = "this;is,\ra\t\n\n\ntest";

s = s.Replace(separators, "\n");


답변

Linq의 집계 기능을 사용할 수 있습니다.

string s = "the\nquick\tbrown\rdog,jumped;over the lazy fox.";
char[] chars = new char[] { ' ', ';', ',', '\r', '\t', '\n' };
string snew = chars.Aggregate(s, (c1, c2) => c1.Replace(c2, '\n'));

확장 방법은 다음과 같습니다.

public static string ReplaceAll(this string seed, char[] chars, char replacementCharacter)
{
    return chars.Aggregate(seed, (str, cItem) => str.Replace(cItem, replacementCharacter));
}

확장 방법 사용 예 :

string snew = s.ReplaceAll(chars, '\n');


답변

가장 짧은 방법입니다.

myString = Regex.Replace(myString, @"[;,\t\r ]|[\n]{2}", "\n");


답변

오, 공연 공포! 대답은 약간 구식이지만 여전히 …

public static class StringUtils
{
    #region Private members

    [ThreadStatic]
    private static StringBuilder m_ReplaceSB;

    private static StringBuilder GetReplaceSB(int capacity)
    {
        var result = m_ReplaceSB;

        if (null == result)
        {
            result = new StringBuilder(capacity);
            m_ReplaceSB = result;
        }
        else
        {
            result.Clear();
            result.EnsureCapacity(capacity);
        }

        return result;
    }


    public static string ReplaceAny(this string s, char replaceWith, params char[] chars)
    {
        if (null == chars)
            return s;

        if (null == s)
            return null;

        StringBuilder sb = null;

        for (int i = 0, count = s.Length; i < count; i++)
        {
            var temp = s[i];
            var replace = false;

            for (int j = 0, cc = chars.Length; j < cc; j++)
                if (temp == chars[j])
                {
                    if (null == sb)
                    {
                        sb = GetReplaceSB(count);
                        if (i > 0)
                            sb.Append(s, 0, i);
                    }

                    replace = true;
                    break;
                }

            if (replace)
                sb.Append(replaceWith);
            else
                if (null != sb)
                    sb.Append(temp);
        }

        return null == sb ? s : sb.ToString();
    }
}


답변

문자열은 불변의 char 배열입니다.

변경 가능하게 만들어야합니다.

  • 사용하여 StringBuilder
  • unsafe세상에 가서 포인터로 놀아 라 (위험하지만)

가장 적은 횟수의 문자 배열을 반복하십시오. HashSet루프 내에서 문자 시퀀스를 순회하지 않기 때문에 여기에 유의 하십시오. 더 빠른 조회가 필요한 경우 (을 기준으로 ) HashSet최적화 된 조회로 교체 할 수 있습니다 .chararray[256]

StringBuilder를 사용한 예제

public static void MultiReplace(this StringBuilder builder,
    char[] toReplace,
    char replacement)
{
    HashSet<char> set = new HashSet<char>(toReplace);
    for (int i = 0; i < builder.Length; ++i)
    {
        var currentCharacter = builder[i];
        if (set.Contains(currentCharacter))
        {
            builder[i] = replacement;
        }
    }
}

편집-최적화 된 버전

public static void MultiReplace(this StringBuilder builder,
    char[] toReplace,
    char replacement)
{
    var set = new bool[256];
    foreach (var charToReplace in toReplace)
    {
        set[charToReplace] = true;
    }
    for (int i = 0; i < builder.Length; ++i)
    {
        var currentCharacter = builder[i];
        if (set[currentCharacter])
        {
            builder[i] = replacement;
        }
    }
}

그런 다음 다음과 같이 사용하십시오.

var builder = new StringBuilder("my bad,url&slugs");
builder.MultiReplace(new []{' ', '&', ','}, '-');
var result = builder.ToString();


답변

문자열 확장 메소드 를 작성 하여 솔루션의 어딘가에 넣을 수도 있습니다.

using System.Text;

public static class StringExtensions
{
    public static string ReplaceAll(this string original, string toBeReplaced, string newValue)
    {
        if (string.IsNullOrEmpty(original) || string.IsNullOrEmpty(toBeReplaced)) return original;
        if (newValue == null) newValue = string.Empty;
        StringBuilder sb = new StringBuilder();
        foreach (char ch in original)
        {
            if (toBeReplaced.IndexOf(ch) < 0) sb.Append(ch);
            else sb.Append(newValue);
        }
        return sb.ToString();
    }

    public static string ReplaceAll(this string original, string[] toBeReplaced, string newValue)
    {
        if (string.IsNullOrEmpty(original) || toBeReplaced == null || toBeReplaced.Length <= 0) return original;
        if (newValue == null) newValue = string.Empty;
        foreach (string str in toBeReplaced)
            if (!string.IsNullOrEmpty(str))
                original = original.Replace(str, newValue);
        return original;
    }
}

다음과 같이 호출하십시오.

"ABCDE".ReplaceAll("ACE", "xy");

xyBxyDxy

이:

"ABCDEF".ReplaceAll(new string[] { "AB", "DE", "EF" }, "xy");

xyCxyF