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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Ti-Soft.StringFunctions" Version="2.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ti-Soft.StringFunctions" Version="2.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Ti-Soft.StringFunctions" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Ti-Soft.StringFunctions --version 2.0.0
                    
#r "nuget: Ti-Soft.StringFunctions, 2.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Ti-Soft.StringFunctions@2.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Ti-Soft.StringFunctions&version=2.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Ti-Soft.StringFunctions&version=2.0.0
                    
Install as a Cake Tool

StringFunctions

StringFunctions — небольшая библиотека с утилитами для работы со строками.

Сейчас библиотека включает четыре основных блока:

  • проверка баланса скобок и кавычек;
  • нормализация строк;
  • разбор строковых диапазонов целых чисел в коллекцию;
  • форматирование коллекции целых чисел обратно в строку диапазонов.

Библиотека ориентирована на практическое использование в прикладных проектах и делает упор на:

  • предсказуемый контракт;
  • отсутствие исключений для ошибок пользовательского ввода;
  • возврат результатов через ResultType;
  • поддержку нескольких версий .NET;
  • покрытие тестами.

Поддерживаемые платформы

Библиотека мультитаргетится на:

  • net6.0
  • net7.0
  • net8.0
  • net9.0
  • net10.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.

Поддерживаются формы записи:

  • N
  • N-M
  • -N
  • N-

Дополнительно поддерживаются:

  • явный 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Ti-Soft.StringFunctions:

Package Downloads
Ti-Soft.SearchEngine

Лёгкая embedded-библиотека для нечёткого и фонетического поиска по строковым полям БД на русском языке с Result-based API.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.0.0 258 3/30/2026
1.9.0 110 3/30/2026