0

NSPredicateを使用して、NSStringに名前と名前の両方があるかどうかを評価しようとしています(基本的に、2つの数字以外の単語の間のスペース)。このコードは私には機能していません(コードはiOS 2.0用のObjective-Cで電子メールアドレスを検証するためのベストプラクティスは何ですか?

-(BOOL) validName:(NSString*) nameString {
    NSString *regExPattern = @"[A-Z]+_[A-Z]";
    NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil];
    NSUInteger regExMatches = [regEx numberOfMatchesInString:nameString options:0 range:NSMakeRange(0, [nameString length])];


    if (regExMatches == 0) {
        return NO;
    } else
        return YES;
    }
}

正規表現パターンに問題があると思いますが、修正方法がわかりません。これは私が文字列をチェックする方法です:

if([self validName:nameTextField.text]) {
  // Valid Name
} else {
  // Name no valid
}
4

2 に答える 2

1

まず、スペースを一致させたい場合は、正規表現パターンにスペースを入れるだけです。現在使用しているアンダースコアを一致させるには、名前フィールドにアンダースコアが必要です。

次に、NSPredicate文字列全体を正規表現と照合するため、スペースがあっても、パターンは通常の姓(複数の文字を含む)をキャッチしません。名前の最後の部分をカバーする式を追加する必要があります。

第3に、テキストフィールドをチェックに直接渡すため、ユーザーに期待どおりにすべてを入力するように圧力をかけています。テストする前に、最初に文字列を少しクリーンアップすることをお勧めします。個人的には、少なくともスペースの文字列をトリミングし、複数のスペースを1つのスペースに置き換えます。

これを行うコードは次のとおりです。

NSString *regExPattern = @"[A-Z]+ [A-Z]+"; //Added a "+" to match the whole string up to the end.

小切手:

NSString *name = nameTextField.text;


name = [name stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

name = [name stringByReplacingOccurrencesOfString:@" +" 
                                       withString:@" " 
                                          options:NSRegularExpressionSearch 
                                            range:NSMakeRange(0, name.length)];
if([self validName: name]) {
  // Valid Name
} else {
  // Name no valid
}

ご想像のとおり、これを行うには多くの方法がありますが、これは始まりです。ただし、単純な正規表現に合格しない名前が多数あるため、「正しい」名前のテストを検討する必要があります。たとえば、アポストロフィとアクセントが付いた名前は次のとおりです。

  1. ジム・オマリー
  2. ゾーイ・ジョーンズ

于 2012-07-12T15:40:41.077 に答える
1

スペースで区切られた前の名前と名前を確認したいだけの場合は、次のようにします。

- (BOOL)validName:(NSString*)name
{
    NSArray *components = [name componentsSeparatedByString:@" "];
    return ([components count] >= 1);    
}

これにより、スペースで区切られた少なくとも2つのコンポーネントがあるかどうかがチェックされます。これは、3つ以上のコンポーネントを持つ名前(ミドルネーム)でも機能します。

于 2012-07-12T16:12:58.423 に答える