Сравнение символов в строке со списком разрешенных - 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 ) );
}