1

サインアップ セクションがある iOS アプリを作成しています。私のクライアントには、検証に関するこれらのひどいルールがあり、それが私を夢中にさせています. 最新のルールは次のとおりです。「abcd」、「eFgH」、「jklM」など、アルファベット順に 3 文字を超える文字を受け入れないでください。

しかし、「1234」、「3456」のように順番に数字を受け入れることができます...

この種の問題を解決するために、私はすでに NSPredicate と NSRegularExpression を使用しています。しかし、これらの文字を識別するための正規表現がわからないので、あなたの助けを求めています.

この問題を解決する方法を知っている人はいますか?

4

2 に答える 2

2

キーボードにアルファベット順のレイアウトがないことにまだ気付いていないことをおめでとうございます:)

NSString * str = [@"01234abcdsfsaasgAWEGFWAE" lowercaseString]; // make it a lower case string as you described it not case-sensitive
const char * strUTF8 = [str UTF8String]; // get char* password text for the numerical comparison

BOOL badPassword = NO;
int charIndex = 0;
int badHitCount = 0;
const int len = strlen(strUTF8);
char previousChar = strUTF8[0]; // the app is going to crash here with an empty string

// check the password
while (charIndex < len) {
    char currentChar = strUTF8[charIndex++];
    if (currentChar - previousChar == 1 && (currentChar >= 57 || currentChar <= 48)) 
    // 57 is the character '9' index at UTF8 table, letters are following this index, some characters are located before 48's '0' character though
        badHitCount++;
    else
        badHitCount = 0;
    previousChar = currentChar;

    if (badHitCount >= 3) {
        badPassword = YES;
        break;
    }
}

if (badPassword) {
    NSLog(@"You are a Bad User !");
} else {
    NSLog(@"You are a Good User !");
}
于 2012-10-29T17:17:50.057 に答える
1

機能する可能性のある最も単純なことから始めます。

BOOL hasAlphabetSequence(NSString *s, int sequenceLength) {
    static NSString *const alphabet = @"abcdefghijklmnopqrstuvwxyz";
    s = [s lowercaseString];
    for (int i = 0, l = (int)alphabet.length - sequenceLength; i < l; ++i) {
        NSString *sequence = [alphabet substringWithRange:NSMakeRange(i, sequenceLength)];
        if ([s rangeOfString:sequence].location != NSNotFound) {
            return YES;
        }
    }
    return NO;
}
于 2012-10-29T17:44:22.957 に答える