假设我有一个字符串,例如:
ma, 100
or, ma, word
, or evenma. , *+
等。
如何在索引之后找到不是某种形式的标点符号(即句号、逗号、冒号、分号)或空格的第一个字符的位置。所以,在上面的最后一个例子中,我想得到*
当我传入 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.IsPunctuation方法,但显然它被认为*
是一个标点符号,所以你必须像上面一样滚动你自己的。