从起始索引获取字符串中的第一个字母数字或特殊字符

时间:2013-08-02 17:47:41

标签: c# string

说我有一个字符串如: ma, 100或,ma, word,甚至ma. , *+等。

如何在索引后找到第一个字符的位置,该字符不是某种形式的标点符号(即句号,逗号,冒号,分号)或空格。所以,在上面的最后一个例子中,当我传入1作为起始索引(从零开始)时,我想得到*的位置。

3 个答案:

答案 0 :(得分:4)

创建要匹配的字符数组并调用String.IndexOfAny

例如:

const string GoodCharsStr =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxy";
readonly char[] GoodChars = GoodCharsStr.ToCharArray();

string search = "ma, 100";
int position = search.IndexOfAny(GoodChars, 1);
if (position == -1)
{
    // not found
}
char foundChar = search[position];

答案 1 :(得分:3)

您需要定义一个特殊字符是什么。

如果它是非连续的集合(根据ASCII排序,请参阅http://www.asciitable.com/),那么您需要定义一个新的允许字符集并检查该集合。

这样的事情应该有效:

public const string allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.,";

public int RetrieveIndex(string input, int startIndex)
{
    for (var x = startIndex; x < input.length; x++)
    {
        if (allowed.IndexOf(input[x])==-1)
        {
            return x;
        }
     }

    return -1;
}

但是,如果它是ASCII标准定义的连续集:

确定哪个范围被认为是可接受的或特殊的,并通过将字符转换为整数并检查它是否在该范围内来检查。这会比调用allowed.IndexOf(...)更快。

答案 2 :(得分:1)

您可以使用这样的方法

public static int GetFirstNonPunctuationCharIndex(string input, int startIndex, char[] punctuation)
{
    //Move the startIndex forward one because we ignore the index user set
    startIndex = startIndex + 1 < input.Length ? startIndex + 1 : input.Length;                 

    for (int i = startIndex  ; i < input.Length; i++)
    {
        if (!punctuation.Contains(input[i]) && !Char.IsWhiteSpace(input[i]))
        {
             return i;
        }
    }

    return -1;
}

你可以通过传入字符串,起始索引和你认为是标点符号的字符数组来调用它。

string myString = @"ma. , *+";
char[] puncArray = new char[4] { '.', ',', ';', ':' };
int index = GetFirstNonPunctuationCharIndex(myString, 1, puncArray)

通常情况下,我会使用Char.IsPunctuation方法,但显然它认为*是一个标点字符,所以你必须像上面那样滚动自己。