Ti-Soft.StringFunctions
2.0.0
dotnet add package Ti-Soft.StringFunctions --version 2.0.0
NuGet\Install-Package Ti-Soft.StringFunctions -Version 2.0.0
<PackageReference Include="Ti-Soft.StringFunctions" Version="2.0.0" />
<PackageVersion Include="Ti-Soft.StringFunctions" Version="2.0.0" />
<PackageReference Include="Ti-Soft.StringFunctions" />
paket add Ti-Soft.StringFunctions --version 2.0.0
#r "nuget: Ti-Soft.StringFunctions, 2.0.0"
#:package Ti-Soft.StringFunctions@2.0.0
#addin nuget:?package=Ti-Soft.StringFunctions&version=2.0.0
#tool nuget:?package=Ti-Soft.StringFunctions&version=2.0.0
StringFunctions
StringFunctions — небольшая библиотека с утилитами для работы со строками.
Сейчас библиотека включает четыре основных блока:
- проверка баланса скобок и кавычек;
- нормализация строк;
- разбор строковых диапазонов целых чисел в коллекцию;
- форматирование коллекции целых чисел обратно в строку диапазонов.
Библиотека ориентирована на практическое использование в прикладных проектах и делает упор на:
- предсказуемый контракт;
- отсутствие исключений для ошибок пользовательского ввода;
- возврат результатов через
ResultType; - поддержку нескольких версий .NET;
- покрытие тестами.
Поддерживаемые платформы
Библиотека мультитаргетится на:
net6.0net7.0net8.0net9.0net10.0
Несмотря на то что net6.0 и net7.0 уже не поддерживаются Microsoft, они сохранены ради совместимости с существующими проектами.
Зависимости
Публичный API библиотеки использует ResultType.
Это означает, что методы, которые могут завершиться ошибкой пользовательского ввода или валидации, возвращают:
Result<T>— если нужно вернуть значение;Result— если нужно вернуть только факт успеха или текст ошибки.
Такой подход позволяет не использовать исключения для штатных ошибок входных данных.
Возможности библиотеки
1. Проверка баланса скобок и кавычек
Проверка выполняется методом IsBracesBalanced.
Поддерживаются:
- заранее известные наборы скобок;
- пользовательские пары символов;
- смешанный сценарий, когда используются и известные типы, и пользовательские пары.
Метод возвращает:
- признак сбалансированности;
- символ, на котором баланс нарушается.
Пример:
using StringFunctions;
using StringFunctions.Braces;
string source = "(a + b) * [c]";
var result = source.IsBracesBalanced(KnownBracesTypes.CommonBraces);
if (result.IsSuccess)
{
var (isBalanced, unbalancedSymbol) = result.Value;
Console.WriteLine(isBalanced); // True
Console.WriteLine(unbalancedSymbol); // '\0'
}
else
{
Console.WriteLine(result.Error);
}
Пример с ошибкой:
using StringFunctions;
using StringFunctions.Braces;
string source = "(a + b]";
var result = source.IsBracesBalanced(KnownBracesTypes.CommonBraces);
if (result.IsSuccess)
{
var (isBalanced, unbalancedSymbol) = result.Value;
Console.WriteLine(isBalanced); // False
Console.WriteLine(unbalancedSymbol); // '('
}
2. Нормализация строк
Нормализация выполняется методом NormalizeString.
Метод приводит строку к более чистому виду по внутренним правилам библиотеки, убирая:
- лишние пробелы;
- лишние пробелы перед пунктуацией;
- повторяющиеся пробелы;
- лишние разделители вокруг некоторых открывающих и закрывающих символов.
Пример:
using StringFunctions;
string source = " Привет , мир ! ";
var result = source.NormalizeString();
if (result.IsSuccess)
{
Console.WriteLine(result.Value); // "Привет, мир!"
}
else
{
Console.WriteLine(result.Error);
}
Для null возвращается Failure, а для пустой или состоящей только из пробелов строки — Success(string.Empty).
3. Разбор строковых диапазонов целых чисел
Разбор выполняется методом IntRangeParser.Parse.
Поддерживаются формы записи:
NN-M-NN-
Дополнительно поддерживаются:
- явный
0; 0-N;0-;- пробелы вокруг
-внутри диапазона.
Результат всегда:
- отсортирован по возрастанию;
- не содержит дублей.
Пример:
using StringFunctions;
var result = IntRangeParser.Parse("1,3-5,8,10-12", 20);
if (result.IsSuccess)
{
// [1, 3, 4, 5, 8, 10, 11, 12]
Console.WriteLine(string.Join(", ", result.Value));
}
else
{
Console.WriteLine(result.Error);
}
Пример с открытыми диапазонами:
using StringFunctions;
var result = IntRangeParser.Parse("-5, 10-", 12);
if (result.IsSuccess)
{
// [1, 2, 3, 4, 5, 10, 11, 12]
Console.WriteLine(string.Join(", ", result.Value));
}
Пример с нулём:
using StringFunctions;
var result = IntRangeParser.Parse("0-3, 10 - 12", 20);
if (result.IsSuccess)
{
// [0, 1, 2, 3, 10, 11, 12]
Console.WriteLine(string.Join(", ", result.Value));
}
Полная спецификация: docs/int-range-parser.md
4. Форматирование коллекции чисел в строку диапазонов
Форматирование выполняется методом IntRangeFormatter.Format.
Библиотека поддерживает две перегрузки:
- базовую — без знания
maxRangeValue; - расширенную — с
maxRangeValueи возможностью использовать открытые диапазоны.
Formatter:
- принимает
IEnumerable<int>; - сортирует входные значения;
- удаляет дубли;
- склеивает соседние значения в диапазоны.
Пример базовой перегрузки:
using StringFunctions;
var result = IntRangeFormatter.Format(new[] { 7, 3, 2, 1, 3, 8, 9, 5 }, ", ");
if (result.IsSuccess)
{
Console.WriteLine(result.Value); // "1-3, 5, 7-9"
}
Пример с использованием открытых диапазонов:
using StringFunctions;
var result = IntRangeFormatter.Format(new[] { 1, 2, 3, 4, 5 }, 10);
if (result.IsSuccess)
{
Console.WriteLine(result.Value); // "-5"
}
Пример с явным нулём:
using StringFunctions;
var result = IntRangeFormatter.Format(new[] { 0, 1, 2, 3 }, 3);
if (result.IsSuccess)
{
Console.WriteLine(result.Value); // "0-"
}
Полная спецификация: docs/int-range-formatter.md
Краткий контракт IntRangeParser
Поддерживаемый формат
N— одиночное число;N-M— обычный диапазон;-N— открытый слева диапазон от1доN;N-— открытый справа диапазон отNдоmaxRangeValue.
Правила для нуля
0допустим;0-Nдопустим;0-допустим;-Nвсегда означает диапазон от1, а не от0.
Ошибки
Метод возвращает Failure, если:
rangeSource == null;maxRangeValue < 0;- токен имеет некорректный формат;
- явно указано значение меньше
0; - граница выходит за пределы
0..maxRangeValue; -Nиспользуется не первым токеном;N-используется не последним токеном.
Краткий контракт IntRangeFormatter
Formatter принимает произвольную последовательность IEnumerable<int> и возвращает нормализованную строку диапазонов.
Правила
- отрицательные значения недопустимы;
- вход может быть неотсортированным;
- дубли допустимы;
- перед форматированием вход сортируется и дедуплицируется;
- соседние значения объединяются в диапазоны.
Открытые диапазоны
Во второй перегрузке при useOpenRanges = true могут использоваться:
-Nдля диапазона1..N;N-для диапазонаN..maxRangeValue;0-для диапазона0..maxRangeValue.
Подключение
Вариант 1. Через исходный код / ProjectReference
<ProjectReference Include="..\StringFunctions\StringFunctions.csproj" />
Вариант 2. Через пакет
После публикации библиотеку можно будет подключать как пакет NuGet.
Тестирование
Для библиотеки добавлены автоматические тесты.
Покрываются:
- parser;
- formatter;
- проверка баланса скобок;
- нормализация строк.
Запуск тестов:
dotnet test
Документация
Дополнительные материалы:
Также для публичного API добавлены XML-комментарии.
Лицензия
См. файл LICENSE.
Статус проекта
Проект развивается как прикладная библиотека с упором на практическую полезность и предсказуемое поведение API.
Основные недавние изменения:
- добавлен
IntRangeParser; - добавлен
IntRangeFormatter; - публичный API приведён к стилю
ResultType; - добавлены тесты и документация.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Ti-Soft.Results (>= 2.0.0)
-
net6.0
- Ti-Soft.Results (>= 2.0.0)
-
net7.0
- Ti-Soft.Results (>= 2.0.0)
-
net8.0
- Ti-Soft.Results (>= 2.0.0)
-
net9.0
- Ti-Soft.Results (>= 2.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.