[c#] 문자열에 10 자 중 하나가 포함되어 있는지 확인

C #을 사용하고 있으며 문자열에 *, &, # 등 10 개의 문자 중 하나가 포함되어 있는지 확인하고 싶습니다.

가장 좋은 방법은 무엇입니까?



답변

다음은 내 관점에서 가장 간단한 방법입니다.

var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1

또는 읽기 쉬운 형식으로 :

var match = str.IndexOfAny("*&#".ToCharArray()) != -1

필요한 컨텍스트 및 성능에 따라 char 배열을 캐시 할 수도 있고 원하지 않을 수도 있습니다.


답변

다른 사람들이 말했듯이 IndexOfAny를 사용하십시오. 그러나 다음과 같이 사용합니다.

private static readonly char[] Punctuation = "*&#...".ToCharArray();

public static bool ContainsPunctuation(string text)
{
    return text.IndexOfAny(Punctuation) >= 0;
}

이렇게하면 호출 할 때마다 새 어레이를 만들지 않아도됩니다. 문자열은 일련의 문자 리터럴 인 IMO보다 스캔하기가 더 쉽습니다.

물론 이것을 한 번만 사용할 것이므로 낭비되는 생성이 문제가되지 않는다면 다음 중 하나를 사용할 수 있습니다.

private const string Punctuation = "*&#...";

public static bool ContainsPunctuation(string text)
{
    return text.IndexOfAny(Punctuation.ToCharArray()) >= 0;
}

또는

public static bool ContainsPunctuation(string text)
{
    return text.IndexOfAny("*&#...".ToCharArray()) >= 0;
}

어떤 것이 더 읽기 쉬운 지, 다른 곳에서 구두점 문자를 사용할지 여부 및 메서드가 호출되는 빈도에 따라 다릅니다.


편집 : 문자열에 정확히 하나 의 문자 가 포함되어 있는지 확인하는 Reed Copsey의 방법에 대한 대안이 있습니다 .

private static readonly HashSet<char> Punctuation = new HashSet<char>("*&#...");

public static bool ContainsOnePunctuationMark(string text)
{
    bool seenOne = false;

    foreach (char c in text)
    {
        // TODO: Experiment to see whether HashSet is really faster than
        // Array.Contains. If all the punctuation is ASCII, there are other
        // alternatives...
        if (Punctuation.Contains(c))
        {
            if (seenOne)
            {
                return false; // This is the second punctuation character
            }
            seenOne = true;
        }
    }
    return seenOne;
}


답변

문자가 포함되어 있는지 확인하려면 다른 곳에서 제안한대로 string.IndexOfAny를 사용하는 것이 좋습니다.

문자열 에 10 개의 문자 중 정확히 하나만 포함되어 있는지 확인 하려면 조금 더 복잡해집니다. 가장 빠른 방법은 교차로를 확인한 다음 중복을 확인하는 것입니다.

private static char[] characters = new char [] { '*','&',... };

public static bool ContainsOneCharacter(string text)
{
    var intersection = text.Intersect(characters).ToList();
    if( intersection.Count != 1)
        return false; // Make sure there is only one character in the text

    // Get a count of all of the one found character
    if (1 == text.Count(t => t == intersection[0]) )
        return true;

    return false;
}


답변

String.IndexOfAny(Char[])

다음은 Microsoft의 문서 입니다.


답변

var specialChars = new[] {'\\', '/', ':', '*', '<', '>', '|', '#', '{', '}', '%', '~', '&'};

foreach (var specialChar in specialChars.Where(str.Contains))
{
    Console.Write(string.Format("string must not contain {0}", specialChar));
}


답변

여러분 모두 감사합니다! (그리고 주로 Jon!) :이를 통해 다음과 같이 작성할 수있었습니다.

    private static readonly char[] Punctuation = "$€£".ToCharArray();

    public static bool IsPrice(this string text)
    {
        return text.IndexOfAny(Punctuation) >= 0;
    }

특정 문자열이 실제로 가격인지 또는 ‘표시하기에 너무 낮음’과 같은 문장인지 감지하는 좋은 방법을 찾고있었습니다.


답변