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

本文关键字:第一个 数字 特殊字符 索引 获取 字符串 | 更新日期: 2023-09-27 18:26:25

假设我有一个字符串,例如:ma, 100ma, word,甚至ma. , *+

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

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

创建一个要匹配的字符数组,并调用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];

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

如果是非连续集(根据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(...)的调用更快。

您可以使用类似的方法

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.IsPumption方法,但显然它认为*是一个标点符号,所以你必须像上面一样滚动自己的。