Сравнение символов в строке со списком разрешенных - C#
Формулировка задачи:
Вводим слово. Может содержать всякие непечатаемые символы, в т.ч. и из других кодировок.
Задача: Вернуть false, если хоть один из символов не входит в список разрешенных.
Застопорился на такой вроде и простой задаче.
v.2 я сделал на регулярке. Не получилось. Регулярка пропускает символы из других кодировок, например '\x2593'
v.3 попытался внести список букв в список типа char. При сравнении выдает ошибку "Не могу преобразовать char в System.Predicate<char>".
Помогите, пожалуйста, найти наиболее оптимальный способ для практического использования.
А также допилить приведенные примеры в учебных целях.
Есть еще вот такие проверки:
Но первая глотает в том числе и символы, которые разрешены, например 'Ё' (может кодировку поставить другую вместо UTF8?)
А вторая проверка - я не понимаю как работает в этой части
using System; using System.Text; using System.Collections.Generic; namespace BadNames3 { public class Class1 { List<char> Good_Symb = new List<char>(); const string mask_normal = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789абвгдежзийклмнопрстуфхцчшщьыъэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯҐЁЄЇіґёєї"; const string mask_special = "'‘’!\"#$%&()*+,-./:;<=>?@[\\]^`{|}~©®№§ "; void Main() { Console.WriteLine(CheckName("SomeBadName")); Console.Read(); } public bool CheckName(string s) // Return true if this nickname we can to use { string all_symb = mask_normal + mask_special; foreach (char ch in all_symb.ToCharArray()) { Good_Symb.Add(ch); } foreach (char ch in s.ToCharArray()) { if ( !(Good_Symb.Exists(ch)) ) // Здесь ошибка - <<<<<<<<<<< return false; } return true; } } }
using System; using System.Text; using System.Text.RegularExpressions; namespace BadNames3 { public class Class1 { const string mask_normal = "\\w\\dА-Яа-яҐЁЄЇіґёєї"; const string mask_special = "'‘’!\"#$%&()*+,-./:;<=>?@[\\]^`{|}~©®№§ "; void Main() { Console.WriteLine(CheckName("SomeBadName")); Console.Read(); } public bool CheckName(string s) // Return true if this nickname we can to use { StringBuilder mask = new StringBuilder(); foreach (char ch in mask_special.ToCharArray()) { mask.Append("\\"); mask.Append(ch); } Regex regex1 = new Regex("[^" + mask_normal + mask.ToString() + "]+"); MatchCollection matches = regex1.Matches(s); return (matches.Count == 0); } } }
if (Encoding.UTF8.GetByteCount(s) != s.Length) return "Bad symbols in the nickname!!!"; if (Array.Exists<char>(s.ToCharArray(), c => c <= '\x001f') || Array.Exists<char>(s.ToCharArray(), c => c >= '\x00bf'))
c => c <= '\x001f'
Почитал про предикаты и понял, что нужно почитать еще разРешение задачи: «Сравнение символов в строке со списком разрешенных»
textual
Листинг программы
private static void Main ( ) { Console.WriteLine( CheckName( "Correct" ) ); // True Console.WriteLine( CheckName( "Cor!rect" ) ); // False Console.WriteLine( CheckName( "Corr\u0001ect" ) ); // False Console.WriteLine( CheckName( "CorrёeЇct" ) ); // True Console.WriteLine( CheckName( "\u9999Correct\u9999" ) ); // True Console.WriteLine( CheckName( "\u9999Cor%rect\u9999" ) ); // False Console.ReadKey(); } private static readonly char[] CorrectChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789абвгдежзийклмнопрстуфхцчшщьыъэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯҐЁЄЇіґёєї\u9999" .ToCharArray(); private static bool CheckName ( string name ) { return name.All( c => CorrectChars.Contains( c ) ); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д