检查字符串是否包含10个字符之一

时间:2009-09-07 19:51:11

标签: c# string

我正在使用C#,我想检查一个字符串是否包含十个字符之一,*,&,#etc等。

最好的方法是什么?

6 个答案:

答案 0 :(得分:190)

在我看来,以下是最简单的方法:

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

或者以一种可能更容易阅读的形式:

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

根据所需的上下文和性能,您可能想要或不想要缓存char数组。

答案 1 :(得分:38)

正如其他人所说,使用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;
}

答案 2 :(得分:5)

如果你只想查看它是否包含任何字符,我建议使用string.IndexOfAny,如其他地方所建议的那样。

如果要验证字符串是否包含十个字符中的正好一个,并且只有一个字符串,那么它会变得有点复杂。我认为最快的方法是检查交叉点,然后检查重复项。

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;
}

答案 3 :(得分:3)

string.IndexOfAny(...)

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

谢谢你们所有人! (主要是乔恩!): 这让我写了这个:

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

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

因为我正在寻找一种很好的方法来检测某个字符串是否实际上是一个价格还是一个句子,例如“显示太低”。