Код:
C#:
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
class Loader
{
Regex regex = new Regex(@"(([\w_.-]+@[\w_.-]+)(?:[;:](.*))?)");
/// <summary>
/// Класс в который будет преобразовыватся наши базки для удобства
/// </summary>
public class Accaunt
{
public string Email, Password;
public string Login => Email.Split('@').First();
public string Domain => Email.Split('@').Last();
public string DomainZone => string.Join(".", Email.Split('@').Last().Split('.').Skip(1));
public string ToString(char spliter = ';') => $"{Email}{spliter}{Password}";
public override string ToString() => $"{Email};{Password}";
}
/// <summary>
/// Класс для хранения настроек сортировки
/// </summary>
public class SortParams
{
public enum ListType
{
BlackList, WhiteList
}
public SortParams()
{
DomainsWhiteList = new Dictionary<ListType, string[]>();
DomainsWhiteList.Add(ListType.BlackList, null);
DomainsWhiteList.Add(ListType.WhiteList, null);
}
//Минимальная и максимальная длина паролей
public int MinPassLength = 0, MaxPassLength = 20;
public Dictionary<ListType, string[]> DomainsWhiteList { get; protected set; }
/// <summary>
/// Добавление запрещенных доменов (для отсеивания)
/// </summary>
/// <param name="domains">Список доменов</param>
public void BlackListAdd(string[] domains) => DomainsWhiteList[ListType.BlackList] = domains;
/// <summary>
/// Дабовление разрешенных доменов
/// </summary>
/// <param name="domains">Список доменов</param>
public void WhiteListAdd(string[] domains) => DomainsWhiteList[ListType.WhiteList] = domains;
//Проверка поролей на наличие спец имвалов
public bool? PasswordSpecChars = null; //Null for any
}
/// <summary>
/// Загрузчик. Возвращает отсортированную коллекцию типа Accaunt[]
/// </summary>
/// <param name="path">Путь к файлу</param>
/// <param name="sortParams">Параметры сортировки (не обязательно)</param>
/// <returns></returns>
public Task<Accaunt[]> LoadBase(string path, SortParams sortParams = null) => Task.Run(() =>
{
//Загружаем файл в память
var tmp_file = File.ReadAllText(path);
IEnumerable<Accaunt> accaunts;
//Проходимсся по файлу регулярным выражением и преобразуем все найденные совпадения в экземпляры класса Accaunt
accaunts = regex.Matches(tmp_file).Cast<Match>().Select(x => new Accaunt() { Email = x.Groups[2].Value, Password = x.Groups[3].Value.Trim() });
//Проверяем на null параметры сортировки
if (sortParams != null)
{
//Проверка пароля на соответствие заданной длине
accaunts = accaunts.Where(
a => a.Password.Length >= sortParams.MinPassLength &&
a.Password.Length <= sortParams.MaxPassLength);
//Проверка доменов по белому и черному списку
accaunts = sortParams.DomainsWhiteList[SortParams.ListType.WhiteList] == null ? accaunts : accaunts.Where(x =>
sortParams.DomainsWhiteList[SortParams.ListType.WhiteList].Contains(x.Domain));
accaunts = sortParams.DomainsWhiteList[SortParams.ListType.BlackList] == null ? accaunts : accaunts.Where(x =>
!sortParams.DomainsWhiteList[SortParams.ListType.BlackList].Contains(x.Domain));
//Проверка налиция либо отсутствия в пароле спец симвала (если переменная проверка активна (не равна null))
accaunts = sortParams.PasswordSpecChars == null
? accaunts : accaunts.Where(x => (sortParams.PasswordSpecChars ?? false) == Regex.IsMatch(x.Password, @"\W"));
}
return accaunts.ToArray();
});
}
Автор: BeCoder