从起始索引获取字符串中的第一个字母数字或特殊字符
本文关键字:第一个 数字 特殊字符 索引 获取 字符串 | 更新日期: 2023-09-27 18:26:25
假设我有一个字符串,例如:ma, 100
或ma, 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方法,但显然它认为*
是一个标点符号,所以你必须像上面一样滚动自己的。