Форум программистов, компьютерный форум, киберфорум
Rust
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Заблокирован

Проверить логин на наличие русских букв

15.04.2023, 00:09. Показов 1963. Ответов 13
Метки rust (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Мне нужно проверить логин на валидность - логин может содержать русские буквы и цифры.
Решил пойти по очевидному пути.


Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//тут у нас строка с русской кириллицей
 
static RUSSIAN_ALPHABET: &str = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНн\
                                        ОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЪъЭэЯя";
 
 
 
 
//тут у нас функция которая проверяет логин на валидность
 
fn is_valid_login(login: &String) -> bool {
       
 
    let length = login.len();
 
 
  //сразу проверяем строку на длину
 
    if length > 28 || length < 2 {
 
        return false;
 
    } 
  
 
    let mut chars = 0;
    let mut digits = 0;
    let mut chars_current = 0;
    let mut digits_current = 0;
    
 
//тут гоняем в цикле и проверяем логин на наличие русских букв и цифр. 
//если их нет, то шлём false - такой логин нас не устраивает.
 
  for word_char in login.chars() {
    
        for ru_char in RUSSIAN_ALPHABET.chars() {
        
            if word_char == ru_char {
        
                chars_current += 1
                
            } else if char::is_digit(word_char, 10) {
                
                digits_current += 1;
                break;
                
            }
       }
       
       if chars_current > 0  || digits_current > 0 {
           
           chars += chars_current;
           chars_current = 0;
           
           digits += digits_current;
           digits_current = 0;
           
       } else {
           
           return false;
       }
       
 
    }   
 
 
//тут проверяем на баланс букв и цифр
       
       if chars_current > 0  || digits_current > 0 {
           
           chars += chars_current;
           chars_current = 0;
           
           digits += digits_current;
           digits_current = 0;
           
       } else {
           
           return false;
       }
       
 
    }

В общем в чём вопрос - может есть способ сделать это как-то иначе?
К тому же есть сомнения - сравниваются буквы или сравниваются их цифровые значения?
Будет ли разница в сравнении в зависимости от кодировки пользователя и тд.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.04.2023, 00:09
Ответы с готовыми решениями:

Проверить строку на наличие русских букв
Задача такова... Нужно создать функцию, которая определяет, есть ли в строке русские буквы. Должен быть цикл, который по-буквенно...

Проверить строку на наличие русских символов
Здравствуйте. В строке могут быть русские символы, латинские символы, пробел, цифры, а так же другие символы, например, слеш. Пример: (...

Проверка переменной на наличие только русских букв
Есть переменная var test = &quot;привет&quot;; можно ли как-то на JavaScript создать условие if которое проверяет данную переменную test на...

13
Модератор
 Аватар для Curry
5153 / 3446 / 536
Регистрация: 01.06.2013
Сообщений: 7,504
Записей в блоге: 9
15.04.2023, 00:52
Цитата Сообщение от Гай Посмотреть сообщение
сравниваются буквы или сравниваются их цифровые значения?
А в чём разница?
Если .chars() то цикл по символам, не по байтам.

Если нужно искать именно русские буквы, то, наверно их явно и придётся задавать. А если достаточно что бы были не английские, то можно проверять
Rust
1
word_char.is_alphabetic() && !word_char.is_ascii_alphabetic()
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
15.04.2023, 01:31
Цитата Сообщение от Гай Посмотреть сообщение

Rust
1
2
3
4
5
6
7
8
for ru_char in RUSSIAN_ALPHABET.chars() {
    if word_char == ru_char {
        chars_current += 1
    } else if char::is_digit(word_char, 10) {
        digits_current += 1;
        break;
    }
}
Что это? Зачем на каждой итерации проверять is_digit?
Rust
1
2
3
4
5
6
use regex::Regex;
//...
fn is_valid(login: &String) -> bool {
     let rgxp = Regex::new(r"^[\p{Cyrillic}\pN]+$").unwrap();
     rgxp.is_match(login)
}
Cargo.toml:
Code
1
2
3
#...
[dependencies]
regex = "1"
1
Заблокирован
15.04.2023, 11:29  [ТС]
Цитата Сообщение от Curry Посмотреть сообщение
А в чём разница?
Если .chars() то цикл по символам, не по байтам.
Вот в этом и вопрос - как сравниваются внутри символы. Ведь в конечном итоге они, наверно, должны сравниваться побайтово.

Цитата Сообщение от Curry Посмотреть сообщение
А если достаточно что бы были не английские, то можно проверять

word_char.is_alphabetic() && !word_char.is_ascii_alphabetic()
Нет, так не годится: если не ascii, то это не значит, что русский, а значит, что любой другой язык - хоть китайский.


Цитата Сообщение от DrType Посмотреть сообщение
Что это? Зачем на каждой итерации проверять is_digit?
решил эту логику сделать во внутреннем цикле, чтобы не перегружать логикой внешний цикл. внутренний цикл всё равно останавливается, если символ - цифра.

Цитата Сообщение от DrType Посмотреть сообщение
regex = "1"
отказался от регэкспов - лишние зависимости. Да и кириллица может быть и болгарская и сербская и тд.

Добавлено через 18 минут
Цитата Сообщение от DrType Посмотреть сообщение
Что это? Зачем на каждой итерации проверять is_digit?
Ну а главное - если наша буква - это цифра, то внутреннему циклю придётся прогнать весь алфавит, сравнивая, если мы вынесем эту логику во внешний цикл
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
15.04.2023, 12:04
Цитата Сообщение от Гай Посмотреть сообщение
Да и кириллица может быть и болгарская и сербская и тд.
Согласен, значит моя регулярка не решает задачи.
Цитата Сообщение от Гай Посмотреть сообщение
внутренний цикл всё равно останавливается, если символ - цифра.
А если не цифра, то проводит лишнюю проверку на каждой итерации.
Цитата Сообщение от Гай Посмотреть сообщение
если наша буква - это цифра, то внутреннему циклю придётся прогнать весь алфавит, сравнивая, если мы вынесем эту логику во внешний цикл
Если цифра, то во внутренний цикл не надо и заходить.

Я так понимаю, у вас нет опыта в кодинге.
0
Заблокирован
15.04.2023, 12:29  [ТС]
Цитата Сообщение от DrType Посмотреть сообщение
Если цифра, то во внутренний цикл не надо и заходить.
Это ещё хуже, это значит, что нужно поместить проверку перед внутренним циклом, а это создаст ещё один уровень вложенности.

Цитата Сообщение от DrType Посмотреть сообщение
А если не цифра, то проводит лишнюю проверку на каждой итерации.
В сущности нет разницы, так как эту проверку нужно проводить в любом случае. Только в вами предлагаемом варианте мы усложним читаемость, добавив ещё один уровень вложенности.

Цитата Сообщение от DrType Посмотреть сообщение
Согласен, значит моя регулярка не решает задачи.
Меня, в принципе, интересует главное вот что - будет ли сказываться кодировка пользователя на всём этом или rust все переводит в свою кодировку внутри, ведь строки раст - это utf-8 строки.

Добавлено через 15 минут
Цитата Сообщение от DrType Посмотреть сообщение
А если не цифра, то проводит лишнюю проверку на каждой итерации.
чтобы её не было, нужно эту проверку во внутренним цикле поставить первой просто - так удастся избежать и лишнего уровня вложенности и лишней проверки.
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
15.04.2023, 12:50
Гай, насчет логики работы - я бы написал так:
Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//тут у нас строка с русской кириллицей
 
static RUSSIAN_ALPHABET: &str = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНн\
                                        ОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЪъЭэЯя"; // ы и ю в алфавите нет, ну да ладно
//тут у нас функция которая проверяет логин на валидность
 
fn is_valid_login(login: &String) -> bool {
    let length = login.len();
    if length > 28 || length < 2 {
        return false;
    }
 
    for word_char in login.chars() {
        if char::is_digit(word_char, 10) {
            continue
        }
        let mut is_russian_letter = false;
        for ru_char in RUSSIAN_ALPHABET.chars() {
            if word_char == ru_char {
                is_russian_letter = true;
                break;
            }
        }
        if !is_russian_letter {
            return false;
        }
    }
    true
}
А программа с вашей функцией даже не скомпилируется.

Насчет кодировок - я не знаю.
0
Заблокирован
15.04.2023, 12:58  [ТС]
Цитата Сообщение от DrType Посмотреть сообщение
Гай, насчет логики работы - я бы написал так:
мне нужно подсчитывать количество символов и цифр для дальнейшей проверки баланса цифр и букв в алфавите. вообще это черновой вариант, и функция будет возвращать потом не bool значения, а варианты перечисления.
0
Модератор
 Аватар для Curry
5153 / 3446 / 536
Регистрация: 01.06.2013
Сообщений: 7,504
Записей в блоге: 9
15.04.2023, 22:15
Цитата Сообщение от Гай Посмотреть сообщение
Да и кириллица может быть и болгарская и сербская и тд.
Буквы болгарского алфавита имеют те же коды что и русского, а в сербском некоторые буквы совпадают с русским.
Так что решение DrType, с регуляркой, возможно лучшее.
Свои 3 копейки.
Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
fn is_valid_login(login: &str) -> bool {
       
 
    let length = login.len();
 
 
  //сразу проверяем строку на длину
 
    if length > 28 || length < 2 {
 
        return false;
 
    } 
  
 
    let mut chars = 0;
 
 
//тут гоняем в цикле и проверяем логин на наличие русских букв и цифр. 
//если их нет, то шлём false - такой логин нас не устраивает.
 
  for word_char in login.chars() {
        if let Some(_) = RUSSIAN_ALPHABET.find(word_char) {
                chars += 1;
                
        } else if char::is_digit(word_char, 10) {
                /*digits += 1;*/
        }else{
           return false;
        }
 
    }   
 
 
//тут проверяем на баланс букв и цифр
    let digits = length - chars;    
    if chars > 0  || digits > 0 { // true всегда
        // тут ещё какие то проверки    
           return true;
    } else {
           return false;
    }
}
0
Заблокирован
16.04.2023, 20:47  [ТС]
Цитата Сообщение от DrType Посмотреть сообщение
А программа с вашей функцией даже не скомпилируется.
у меня всё компилируется. просто функция целиком не вставилась почему-то сначала. вот её полный вариант


Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
fn is_valid_login(login: &String) -> bool {
       
 
    let length = login.len();
 
 
    if length > 28 || length < 2 {
 
        println!("len: {}", length);
 
        return false;
 
    } 
 
    println!("login = {}", login);     
 
    let mut chars = 0;
    let mut digits = 0;
    let mut chars_current = 0;
    let mut digits_current = 0;
    
 
    for word_char in login.chars() {
    
        for ru_char in RUSSIAN_ALPHABET.chars() {
        
            if word_char == ru_char {
        
                chars_current += 1
                
            } else if char::is_digit(word_char, 10) {
                
                digits_current += 1;
                break;
                
            }
       }
       
       if chars_current > 0  || digits_current > 0 {
           
           chars += chars_current;
           chars_current = 0;
           
           digits += digits_current;
           digits_current = 0;
           
       } else {
           
           return false;
       }
       
 
    }   
 
 
    if chars >= 1 {     
      
        if chars > digits && chars - digits > 1 {
        
          return true;
        }
 
        if  digits > chars && digits  - chars <= 2 {
         
          return true; 
        }
     
    } 
    
    
      false
    
}
Добавлено через 1 минуту
Цитата Сообщение от Curry Посмотреть сообщение
Буквы болгарского алфавита имеют те же коды что и русского, а в сербском некоторые буквы совпадают с русским.
это логично, что у одинаковых букв совпадают коды, просто, например, в сербской кириллице добавляются коды букв свойственных для этого алфавита
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
22.04.2023, 07:56
Цитата Сообщение от Гай Посмотреть сообщение
//сразу проверяем строку на длину
Кстати, вы неправильно проверяете длину строки.

Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
trait FoxPassword {
    fn is_valid_login(&self) -> bool;
}
 
impl FoxPassword for String {
    fn is_valid_login(&self) -> bool {
        let chars = self.chars();
        let length = chars.count();
        dbg!(&length);  // &length = 21
 
        let length = self.len();
        dbg!(&length);  // &length = 31
        if length < 2 || length > 28 {
            return false;
        }
        true
    }
}
 
fn main() {
    let login = String::from("Trixie - лучшая пони!");
    println!("{}", login.is_valid_login());
}
1
Заблокирован
23.04.2023, 11:06  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Кстати, вы неправильно проверяете длину строки.
Мне количество байт нужно, а не количество букв, поэтому всё правильно я проверяю.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
23.04.2023, 13:17
Это очень странно, так как даже СУБД хранят char'ы, а не байты.
0
Заблокирован
23.04.2023, 21:05  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Это очень странно
Ничего странного: символы юникода могут весить от 1 до 4 байт. Если ты, например, введёшь 10 трёх байтных символов, то это будет 30 байт, а если 10 одно байтных, то 10 байт. Как видим количество символов одинаковое, а колличество байт существенно разнится. Тем более, что эту проверку я уберу и поставлю ее для поля ввода - такая проверка предоставляется GUI и задаётся именно в байтах.

Цитата Сообщение от Рыжий Лис Посмотреть сообщение
так как даже СУБД хранят char'ы, а не байты.
Проверять можно длину в байтах, а дальше для СУБД использовать чары - не вижу проблемы. Но я и СУБД не буду использовать, а буду всё хранить в отдельных файлах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.04.2023, 21:05
Помогаю со студенческими работами здесь

Проверка TextBox на наличие русских букв и цифр
Сори за ламерство, мне нужно, чтобы при нажатии на кнопку у меня проверялся текстбокс на наличие русских букв и цифр, что надо сделать?

Синтаксический анализатор (проверка на наличие русских букв)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Как проверить переменную на наличие русских символов ?
Как проверить переменную на наличие русских символов ?

Файлы и множества.Заданое множество букв латинского алфавита. Проверить наличие в этом множестве всех букв от 'A' до 'Z'. Символы вводить с клавиатуры
1)Заданое множество букв латинского алфавита. Проверить наличие в этом множестве всех букв от 'A' до 'Z'. Символы вводить с клавиатуры ....

Проверить текст на наличие букв
2. Дан текст, за которым следует точка. Если в заданный текст входит каждая буква из слова key, тогда напечатать yes, иначе – no.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru