C# 检测字符串是否全部为大写
在C#中,有没有一种方法可以检测字符串是否都是大写的C# 检测字符串是否全部为大写,c#,string,C#,String,在C#中,有没有一种方法可以检测字符串是否都是大写的 大多数字符串都很短(即少于100个字符)我会将字符串转换为所有大写字母(使用ToUpper),然后将其与原始字符串进行比较(使用Equals)。在一行代码中应该是可行的 返回s.Equals(s.ToUpper())简单吗 if (input.ToUpper() == input) { // string is all upper } 使用 无需创建新字符串: bool IsAllUpper(string input) {
大多数字符串都很短(即少于100个字符)我会将字符串转换为所有大写字母(使用
ToUpper
),然后将其与原始字符串进行比较(使用Equals
)。在一行代码中应该是可行的
返回s.Equals(s.ToUpper())
简单吗
if (input.ToUpper() == input)
{
// string is all upper
}
使用
无需创建新字符串:
bool IsAllUpper(string input)
{
for (int i = 0; i < input.Length; i++)
{
if (!Char.IsUpper(input[i]))
return false;
}
return true;
}
bool IsAllUpper(字符串输入)
{
for(int i=0;i
编辑:如果您想跳过非字母字符(OP的原始实现没有,但他/她的评论表明他们可能想要):
bool IsAllUpper(字符串输入)
{
for(int i=0;i
如果这需要有良好的性能,我假设它经常发生。如果是这样的话,采取你的解决方案,做几百万次,并计时。我怀疑您的解决方案比其他解决方案更好,因为您没有创建一个必须清理的新垃圾收集对象,而且您无法创建一个字符串的副本而不进行迭代。我认为:
bool equals = (String.Compare(input, input.ToUpper(), StringComparison.Ordinal) == 0)
也将起作用,并且您可以确保在不考虑管柱套管的情况下进行比较(我认为VB.NET默认情况下忽略大小写)。O甚至使用
String.CompareOrdinal(input,input.ToUpper())
我喜欢LINQ方法
如果要将其限制为所有大写字母(即无空格等):
或使用方法组转换:
return input.All(char.IsUpper);
如果您只想禁止小写字母:
return !input.Any(c => char.IsLower(c));
或
我想到了正则表达式。发现了以下问题:确保您的资本化定义与.NET资本化定义匹配 .Net中的ToUpper()是一种语言操作。在某些语言中,大小写规则并不直接 你可以用
// Meaning of ToUpper is basically 'ASCII' ToUpper no matter the locale.
if (input.ToUpper(CultureInfo.InvariantCulture) == input)
{
// string is all upper
}
您可能会试图通过逐字符大写来节省内存
for(int i=0;i
上面的代码引入了一个bug。一些非英语的“字母”需要两个.net字符来编码(代理项对)。您必须检测这些对,并将它们作为单个单元大写
此外,若您省略了文化信息以获取语言大写,则会引入一个错误,在某些地区,您的自制大写算法和该地区的.net算法不一致
当然,如果您的代码永远不会在讲英语的地区之外运行,或者永远不会收到非英语文本,那么这些都不重要。另一种方法
return input.Equals(input.ToUpper(), StringComparison.Ordinal)
您还可以调用Windows函数,告诉您字符串的组成
GetStringTypeEx(LOCALE_USER_DEFAULT, CT_CTYPE1, s, s.Length, ref characterTypes);
您为它提供了一个与字符串长度相同的UInt16
数组,它用标志的按位组合填充每个元素:
(0x0001):大写C1\u大写
(0x0002):小写C1\u LOWER
(0x0004):十进制数字C1_位
(0x0008):空格字符C1_空格
(0x0010):标点符号C1\u punt
(0x0020):控制字符C1\u CNTRL
(0x0040):空白字符C1_BLANK
(0x0080):十六进制数字C1\u XDIGIT
(0x0100):任何语言字符:字母、音节或表意文字。有些字符可以是alpha而不是大写或小写C1_ALPHA
(0x0200):定义的字符,但不是其他C1\u*类型之一C1\u定义的
| | H | e | l | l | o | , | | " | 4 | 2 | " | ! |
|------------|---|---|---|---|---|---|---|---|---|---|---|---|
| Defined | X | X | X | X | X | X | X | X | X | X | X | X |
| Alpha | x | x | x | x | x | | | | | | | |
| XDigit | | x | | | | | | | x | x | | |
| Blank | | | | | | | x | | | | | |
| Cntrl | | | | | | | | | | | | |
| Punct | | | | | | x | | | | | x | x |
| Space | | | | | | | x | | | | | |
| Digit | | | | | | | | | x | x | | |
| Lower | | x | x | x | x | | | | | | | |
| Upper | x | | | | | | | | | | | |
在循环中,一旦找到小写字符,则无需继续,因为它已通过测试。当它看到非字母(例如标点符号或空格)时,您希望结果是什么?ToUpper解决方案返回true;该问题返回false。如果(!Char.isleter(输入[i])| | Char.IsUpper(输入[i]){etc}与此问题类似:。文化会起作用吗?如果是这样,则接受的答案是不正确的。出于我的目的,当包含非字母字符时,我需要它返回true。所以当它计算ABC1而不是false时,我需要它是真的。我已经尝试了这两种解决方案,在这个例子中,ToUpper更适合我的需要。我很高兴能得到一个简单的最佳答案,可惜你比我抢先一步:(这对像“ABC1”或“*!()”这样的字符串求值为“true”)。我不知道原始的posters上下文,但对于包含非大写字母的字符串,此解决方案肯定会返回“true”。代码越少越好。一种方法是不必要地将其转换为大写,另一种方法是不必要地将一个简单==转换为九行循环函数。如果分析显示有帮助,请进行优化。我建议go使用Toupper不变量()时,此解决方案优于公认的解决方案(IMHO)因为它不需要创建不必要的字符串。可能需要更多的代码行,但这并不总是一件坏事。你赢了一些,你输了一些。我不敢相信接受的答案收到了多少+1。我同意,这个答案比基于.ToUpper()或if(input.All(Char.IsUpper){}的任何答案都好我不明白为什么要有一个10行的函数,当你可以用一行来断言一个简单的正则表达式匹配时…谷歌叔叔告诉我像
newregex(@“[a-Z]+”).IsMatch(input)
应该可以用…或者…检查[a-Z],应该有
// Meaning of ToUpper is linguistic and depends on what locale this executes
// This test could pass or fail in ways that surprise you.
if (input.ToUpper() == input)
{
// string is all upper
}
// Meaning of ToUpper is basically 'ASCII' ToUpper no matter the locale.
if (input.ToUpper(CultureInfo.InvariantCulture) == input)
{
// string is all upper
}
for(int i = 0; i < input.Length; i++) {
if(input[i] != Char.ToUpper(input[i], CultureInfo.InvariantCulture)) {
return false;
}
}
return input.Equals(input.ToUpper(), StringComparison.Ordinal)
GetStringTypeEx(LOCALE_USER_DEFAULT, CT_CTYPE1, s, s.Length, ref characterTypes);
| | H | e | l | l | o | , | | " | 4 | 2 | " | ! |
|------------|---|---|---|---|---|---|---|---|---|---|---|---|
| Defined | X | X | X | X | X | X | X | X | X | X | X | X |
| Alpha | x | x | x | x | x | | | | | | | |
| XDigit | | x | | | | | | | x | x | | |
| Blank | | | | | | | x | | | | | |
| Cntrl | | | | | | | | | | | | |
| Punct | | | | | | x | | | | | x | x |
| Space | | | | | | | x | | | | | |
| Digit | | | | | | | | | x | x | | |
| Lower | | x | x | x | x | | | | | | | |
| Upper | x | | | | | | | | | | | |