说我有一个字符串如:
ma, 100
或,ma, word
,甚至ma. , *+
等。
如何在索引后找到第一个字符的位置,该字符不是某种形式的标点符号(即句号,逗号,冒号,分号)或空格。所以,在上面的最后一个例子中,当我传入1作为起始索引(从零开始)时,我想得到*
的位置。
答案 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方法,但显然它认为*
是一个标点字符,所以你必须像上面那样滚动自己。