1

假设我有一个字符串,例如: ma, 100or, ma, word, or evenma. , *+等。

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

4

3 回答 3

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];
于 2013-08-02T18:17:21.753 回答
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(...)

于 2013-08-02T17:58:16.817 回答
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方法,但显然它被认为*是一个标点符号,所以你必须像上面一样滚动你自己的。

于 2013-08-02T18:01:18.687 回答