文字列がすべて大文字かどうかを判断するにはどうすればよいですか?
個々の文字が大文字の文字セットの一部であることを確認できることは知っていますが、もっと簡単な方法はありますか?
次のようなものを試すことができます:
if ([[s uppercaseStringWithLocale:[NSLocale currentLocale]] isEqualToString:s])
{
// ... s is uppercase ...
}
else
{
// ... s is not all uppercase ...
}
質問を解釈する方法はいくつかあります。これらの各例では、文字列をテストするだけで、新しいコピーを作成する必要はありません。
1) 文字列に含まれるすべての文字が大文字であることを確認します (ただし、句読点、数字、空白などの他の文字は引き続き使用できます)。例:
NSCharacterSet *lowerCaseSet = [NSCharacterSet lowercaseLetterCharacterSet];
if ([myString rangeOfCharacterFromSet:lowerCaseSet].location == NSNotFound)
NSLog(@"String is in upper case.");
else
NSLog(@"String has invalid characters.");
2) 文字列内のすべての文字が大文字であることを確認します (その他の文字は使用できません)。例:
NSCharacterSet *invalidCharacterSet = [[NSCharacterSet uppercaseLetterCharacterSet] invertedSet];
if ([myString rangeOfCharacterFromSet:invalidCharacterSet].location == NSNotFound)
NSLog(@"String has only upper case characters.");
else
NSLog(@"String has invalid characters.");
3) 文字列内のすべての文字が大文字または空白であることを確認します (その他の文字は許可されません)。例:
NSMutableCharacterSet *allowedCharacterSet = [NSMutableCharacterSet uppercaseLetterCharacterSet];
[allowedCharacterSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
NSCharacterSet *invalidCharacterSet = [allowedCharacterSet invertedSet];
if ([myString rangeOfCharacterFromSet:invalidCharacterSet].location == NSNotFound)
NSLog(@"String has only upper case characters and/or white space.");
else
NSLog(@"String has invalid characters.");
ここには多くの良い答えがあるので、いくつかの国のアルファベットの文字で機能する正規表現ベースの答えを少しだけ紹介しましょう。
[A-Z]*
Gordon Dove は、トラディショナルは A から Z までのラテン語/英語のアルファベットの実際の文字にのみ一致し、たとえばアクセント付きの文字やその他のアルファベットとはまったく一致しないと正しく述べました.
したがって、完全を期すために、大文字で定義されている大文字に一致する ICU 正規表現を次に示します\p{Lu}
(単一の大文字)。
それをテストするには (キーボードで入力できるいくつかの西ヨーロッパの文字を使用して、読者は自由に他の文字を追加してください):
NSString *lowercase = @"äbcdéfghìjklmñöpqrstûvwxyzæøå";
NSString *mixedcase = @"ÄbcDÉFGHïjkLmÑÖpqrstÛvwxyzÆøÅ";
NSString *uppercase = @"ÄBCDÉFGHÏJKLMÑÖPQRSTÛVWXYZÆØÅ";
NSArray *cases = @[lowercase, mixedcase, uppercase];
NSString *uppercasePattern = @"\\p{Lu}*"; // Letter, uppercase, zero or more occurrences
NSPredicate *ucPred = [NSPredicate predicateWithFormat:@"self MATCHES %@", uppercasePattern];
NSArray *ucArray = [cases filteredArrayUsingPredicate:ucPred];
単一の文字列をテストする必要がある場合は、述語を直接使用できます。
if ( [ucPred evaluateWithObject:uppercase] ) {
NSLog(@"It's uppercase");
}
パターン文字列を個別の変数として定義する必要はありませんが、コードの可読性が向上する傾向があります。