我想在字符串中找到第一个大写字母出现的索引。
例如 -
String x = "soHaM";
该字符串的索引应返回 2。找到第一个大写字母后,正则表达式应忽略所有其他大写字母。如果没有找到大写字母,那么它应该返回 0。请帮助。
我很确定您需要的只是正则表达式:A-Z
\p{Lu}
public static class Find
{
// Apparently the regex below works for non-ASCII uppercase
// characters (so, better than A-Z).
static readonly Regex CapitalLetter = new Regex(@"\p{Lu}");
public static int FirstCapitalLetter(string input)
{
Match match = CapitalLetter.Match(input);
// I would go with -1 here, personally.
return match.Success ? match.Index : 0;
}
}
你试过这个吗?
只是为了好玩,一个 LINQ 解决方案:
string x = "soHaM";
var index = from ch in x.ToArray()
where Char.IsUpper(ch)
select x.IndexOf(ch);
这返回IEnumerable<Int32>
。如果您想要第一个大写字符的索引,只需调用index.First()
或检索 LINQ 中的第一个实例:
string x = "soHaM";
var index = (from ch in x.ToArray()
where Char.IsUpper(ch)
select x.IndexOf(ch)).First();
编辑
正如评论中所建议的,这是另一种 LINQ 方法(可能比我最初的建议更高效):
string x = "soHaM";
x.Select((c, index) => new { Char = c, Index = index }).First(c => Char.IsUpper(c.Char)).Index;
不需要Regex
:
int firstUpper = -1;
for(int i = 0; i < x.Length; i++)
{
if(Char.IsUpper(x[i]))
{
firstUpper = i;
break;
}
}
http://msdn.microsoft.com/en-us/library/system.char.isupper.aspx
为了完整起见,这是我的 LINQ 方法(尽管它不是正确的工具,即使 OP 可以使用它):
int firstUpperCharIndex = -1;
var upperChars = x.Select((c, index) => new { Char = c, Index = index })
.Where(c => Char.IsUpper(c.Char));
if(upperChars.Any())
firstUpperCharIndex = upperChars.First().Index;
首先,您的逻辑失败,如果该方法在您的情况下返回 0,则意味着该列表中的第一个字符是大写字母,因此我建议找不到 -1 或抛出异常。
无论如何,只需使用正则表达式,因为您并不总是最好的选择,而且它们通常非常缓慢且难以阅读,这使得 yoru 代码更难使用。
无论如何,这是我的贡献
public static int FindFirstUpper(string text)
{
for (int i = 0; i < text.Length; i++)
if (Char.IsUpper(text[i]))
return i;
return -1;
}
使用循环
int i = 0;
for(i = 0; i < mystring.Length; i++)
{
if(Char.IsUpper(mystring, i))
break;
}
i 是你应该关注的值;
使用 Linq:
using System.Linq;
string word = "soHaMH";
var capChars = word.Where(c => char.IsUpper(c)).Select(c => c);
char capChar = capChars.FirstOrDefault();
int index = word.IndexOf(capChar);
使用 C#:
using System.Text.RegularExpressions;
string word = "soHaMH";
Match match= Regex.Match(word, "[A-Z]");
index = word.IndexOf(match.ToString());