А как сделать так, чтобы после слэша можно было юзать две заглавные? По типу, Marty_McFly
Вид для печати
А как сделать так, чтобы после слэша можно было юзать две заглавные? По типу, Marty_McFly
Ну то, найден ли нижний слеш или нет, отображается в переменной "__". Соответственно, нужно добавить проверку на количество заглавных букв в "default", приписав проверку на нижний слэш, а так же в "case '_':".
Как-то так, короче:
stock bool:IsRPNick(const name[]) { // http://pro-pawn.ru/showthread.php?7528 static i, __, bs; if (('A' <= name[0] <= 'Z' && ('a' <= name[1] <= 'z'))) { for (i = 1, __ = 0, bs = 0;;) { switch (name[++i]) { case 'a'..'z': continue; case '_': if (__++, 'A' <= name[++i] <= 'Z' && 'a' <= name[++i] <= 'z') continue; else if ('A' <= name[i-1] <= 'Z' && 'A' <= name[i] <= 'Z' && 'a' <= name[++i] <= 'z') { bs++; continue; } else break; case '\0': return (i >= 4 && __ == 1); default: { if(__ == 1 && bs == 0 && 'A' <= name[i] <= 'Z') { bs++; continue; } return false; } } } } return false; }
Это если минимально изменять алгоритм (собственно, что первое в голову пришло). И это явно не самый оптимальный вариант реализации, ибо он будет трудно масштабируемым в текущем виде.
Сходу получилось вспомнить следующие префиксы для фамилий:
- "Mc" - ирландско-шотландский патроним; также встречается вариант "Mac" (примеры: "McSmith", "MacDonald");
- "O'" - ирландский патроним (примеры: "O'Brian", "O'Connor");
- "al-" - определённый артикль в арабском языке, нечто вроде "the" из английского, который в фамилиях обозначает принадлежность человека к какому-либо месту или профессии (пример: "al-Kufi" (от "Kufa" - название города в Ираке)).
- "Al" - тоже из арабского языка, означает принадлежность человека к определённой семье, клану или династии (пример: "Al Saud").
Если я забыл какие-то ещё часто встречающиеся префиксы - дайте знать, добавлю в этот пост.
И вот вариант функции, который учитывает только префиксы из списка, не позволяя делать рандомные фамилии с двумя заглавными буквами:
stock bool:IsRPNick(const name[]) { // http://pro-pawn.ru/showthread.php?7528&p=95478&viewfull=1#post95478 static i, j, __; if ('A' <= name[0] <= 'Z' && 'a' <= name[1] <= 'z') { for (i = 1, __ = 0;;) { switch (name[++i]) { case 'a'..'z': continue; case '_': { static const prefixes[][] = { "Mc", "Mac", "O", "von_", "van_", "al_", "Al_" }; static const prefix_lengths[] = { 2, 3, 1, 4, 4, 3, 3 }; for (++__, ++i, j = 0; j < sizeof(prefixes); ++j) { continue; if ('A' <= name[i + prefix_lengths[j]] <= 'Z') i += prefix_lengths[j]; break; } if ('A' <= name[i] <= 'Z' && 'a' <= name[++i] <= 'z') continue; else break; } case '\0': return (i >= 4 && __ == 1); default: return false; } } } return false; }
Примеры никнеймов с префиксами для фамилий, которые эта функция пропускает:
Код:John_McSmith
Gerald_MacDonald
Charles_OConnor
Mohammad_al_Kufi
Mohammad_Al_Saud
Добавь в основной пост ссылку на этот пост. А то затеряется среди других сообщений.