Serghei Cebotari
6fe0a5e92b
commit 688c5426e8793b808b9c75c9a19733af0a402fcb Author: Serghei Cebotari <serghei@cebotari.ru> Date: Sun Jul 21 16:25:14 2024 +0300 Switch to port 8080 commit c39249f6528ec76686a9382d1dc375c07d1d5044 Author: Serghei Cebotari <serghei@cebotari.ru> Date: Sun Jul 21 16:24:59 2024 +0300 Switch to alpine image commit 5318d7ec3f4f3d205549cf6732fa5b066a1d0a36 Author: Serghei Cebotari <serghei@cebotari.ru> Date: Sun Jul 21 15:40:14 2024 +0300 Add docker commit b6cd60a973da26bc92cf1fb45b4d2396b7ce56ea Author: Serghei Cebotari <serghei@cebotari.ru> Date: Sun Jul 21 15:00:12 2024 +0300 Delete asynchrony commit 44a194e6d27312f3b8dd0b9c9c02d873e06e0b22 Author: Serghei Cebotari <serghei@cebotari.ru> Date: Sun Jul 21 14:59:29 2024 +0300 Add Equals and GetHasCode methods overrides to ProductQuantity class commit a274eadd313e12f11cc84d32e5030bbc5b187f8c Author: Serghei Cebotari <serghei@cebotari.ru> Date: Sun Jul 21 14:58:37 2024 +0300 Add parsers tests commit 4f969e70d9716d8ddb4f4efedd466846289d7e2b Author: Serghei Cebotari <serghei@cebotari.ru> Date: Sun Jul 21 14:57:55 2024 +0300 Update product tests commit 2485e20d0e93bed562f929055b6867dc2574a95b Author: Serghei Cebotari <serghei@cebotari.ru> Date: Sat Jul 20 19:34:19 2024 +0300 Implement Excel parser commit30f2e28c87
Author: Serghei Cebotari <serghei@cebotari.ru> Date: Sat Jul 20 16:58:35 2024 +0300 Implement csv parser commit08e86b43c0
Author: Serghei Cebotari <serghei@cebotari.ru> Date: Thu Jul 18 21:01:28 2024 +0300 Edit port number
65 lines
1.9 KiB
C#
65 lines
1.9 KiB
C#
using System.Text.RegularExpressions;
|
||
|
||
namespace RhSolutions.SkuParser.Models;
|
||
|
||
public record Product
|
||
{
|
||
/// <summary>
|
||
/// Артикул РЕХАУ в заданном формате
|
||
/// </summary>
|
||
public required string Sku
|
||
{
|
||
get => _sku;
|
||
set
|
||
{
|
||
_sku = IsValudSku(value)
|
||
? value
|
||
: throw new ArgumentException("$Неверный артикул: {value}");
|
||
}
|
||
}
|
||
private string _sku = string.Empty;
|
||
private const string _parsePattern = @"(?<Lead>[1\s]|^|\b)(?<Article>\d{6})(?<Delimiter>[\s13-])(?<Variant>\d{3})(\b|$)";
|
||
private const string _validnessPattern = @"^1\d{6}[1|3]\d{3}$";
|
||
|
||
private static bool IsValudSku(string value)
|
||
{
|
||
return Regex.IsMatch(value.Trim(), _validnessPattern);
|
||
}
|
||
private static string GetSku(Match match)
|
||
{
|
||
string lead = match.Groups["Lead"].Value;
|
||
string article = match.Groups["Article"].Value;
|
||
string delimiter = match.Groups["Delimiter"].Value;
|
||
string variant = match.Groups["Variant"].Value;
|
||
|
||
if (lead != "1" && delimiter == "-")
|
||
{
|
||
return $"1{article}1{variant}";
|
||
}
|
||
else
|
||
{
|
||
return $"{lead}{article}{delimiter}{variant}";
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Проверка строки на наличие в ней артикула РЕХАУ
|
||
/// </summary>
|
||
/// <param name="value">Входная строка для проверки</param>
|
||
/// <param name="product">Артикул, если найден. null - если нет</param>
|
||
/// <returns>Если артикул в строке есть возвращает true, Если нет - false</returns>
|
||
public static bool TryParse(string value, out Product? product)
|
||
{
|
||
product = null;
|
||
MatchCollection matches = Regex.Matches(value, _parsePattern);
|
||
if (matches.Count == 0)
|
||
{
|
||
return false;
|
||
}
|
||
string sku = GetSku(matches.First());
|
||
product = new Product() { Sku = sku };
|
||
return true;
|
||
}
|
||
public override int GetHashCode() => Sku.GetHashCode();
|
||
public override string ToString() => Sku;
|
||
} |