Métodos de Cadenas
Esta página cubre todos los métodos relacionados con strings disponibles en ValiFlow<T>. Están definidos en StringExpression<TBuilder, T> y son accesibles directamente desde tu instancia del builder ValiFlow<T>.
Ejemplos: ValiFlow · Evaluators
Longitud
MinLength
Pasa cuando el string tiene al menos N caracteres. Retorna false para null.
var rule = new ValiFlow<User>()
.MinLength(x => x.Name, 3);
MaxLength
Pasa cuando el string tiene como máximo N caracteres. Retorna true para null.
var rule = new ValiFlow<User>()
.MaxLength(x => x.Name, 100);
LengthBetween
Pasa cuando la longitud del string se encuentra dentro del rango inclusivo [min, max].
var rule = new ValiFlow<User>()
.LengthBetween(x => x.Name, 3, 100);
ExactLength
Pasa cuando el string tiene exactamente N caracteres.
var rule = new ValiFlow<Order>()
.ExactLength(x => x.PostalCode, 5);
Null / Empty / Whitespace
IsNullOrEmpty
Pasa cuando el valor es null o un string vacío ("").
var rule = new ValiFlow<User>()
.IsNullOrEmpty(x => x.Description);
IsNotNullOrEmpty
Pasa cuando el valor no es null ni "".
var rule = new ValiFlow<User>()
.IsNotNullOrEmpty(x => x.Name);
IsNullOrWhiteSpace
Pasa cuando el valor es null, "", o contiene únicamente caracteres de espacio en blanco.
var rule = new ValiFlow<Product>()
.IsNullOrWhiteSpace(x => x.Code);
IsNotNullOrWhiteSpace
Pasa cuando el valor contiene al menos un carácter que no sea espacio en blanco.
var rule = new ValiFlow<Product>()
.IsNotNullOrWhiteSpace(x => x.Code);
IsTrimmed
Pasa cuando el valor no tiene espacios en blanco al inicio ni al final (equivalente a value == value.Trim()). Retorna true para null.
var rule = new ValiFlow<User>()
.IsTrimmed(x => x.Name);
Contenido
Contains (selector único)
Pasa cuando el string contiene la subcadena indicada. Por defecto usa StringComparison.OrdinalIgnoreCase.
// Sin distinción de mayúsculas (por defecto)
var rule = new ValiFlow<Product>()
.Contains(x => x.Name, "test");
// Con comparación explícita
var rule = new ValiFlow<Product>()
.Contains(x => x.Name, "test", StringComparison.Ordinal);
Nota:
string.Contains(string, StringComparison)no es traducible por EF Core.
Contains (múltiples selectores)
Pasa cuando la subcadena se encuentra en cualquiera de las propiedades string indicadas (semántica OR). Internamente usa ToLower() más Contains de un solo argumento.
var rule = new ValiFlow<Product>()
.Contains("widget", x => x.Name, x => x.Description, x => x.Tags);
Nota: Solo en memoria — no traducible por EF Core.
StartsWith
Pasa cuando el string comienza con el prefijo indicado. Por defecto usa OrdinalIgnoreCase.
var rule = new ValiFlow<Order>()
.StartsWith(x => x.Reference, "ORD");
EndsWith
Pasa cuando el string termina con el sufijo indicado. Por defecto usa OrdinalIgnoreCase.
var rule = new ValiFlow<User>()
.EndsWith(x => x.Email, ".com");
EqualsIgnoreCase
Pasa cuando el string es igual al valor objetivo sin distinción de mayúsculas (StringComparison.OrdinalIgnoreCase).
var rule = new ValiFlow<Product>()
.EqualsIgnoreCase(x => x.Code, "ABC");
IsUpperCase
Pasa cuando todos los caracteres alfabéticos del string están en mayúsculas.
var rule = new ValiFlow<Product>()
.IsUpperCase(x => x.Code);
IsLowerCase
Pasa cuando todos los caracteres alfabéticos del string están en minúsculas.
var rule = new ValiFlow<Product>()
.IsLowerCase(x => x.Slug);
HasOnlyDigits
Pasa cuando el string no está vacío y contiene únicamente dígitos (0–9).
var rule = new ValiFlow<User>()
.HasOnlyDigits(x => x.Pin);
HasOnlyLetters
Pasa cuando el string no está vacío y contiene únicamente letras.
var rule = new ValiFlow<User>()
.HasOnlyLetters(x => x.Name);
HasLettersAndNumbers
Pasa cuando el string contiene al menos una letra y al menos un dígito.
var rule = new ValiFlow<User>()
.HasLettersAndNumbers(x => x.Password);
HasSpecialCharacters
Pasa cuando el string contiene al menos un carácter que no sea letra ni dígito.
var rule = new ValiFlow<User>()
.HasSpecialCharacters(x => x.Password);
Validadores de Formato
Todos los validadores de formato usan patrones de regex compilados definidos en RegularExpressions/RegularExpression.cs. Se evalúan en memoria.
IsEmail
Pasa cuando el valor tiene un formato de correo electrónico estándar.
var rule = new ValiFlow<User>()
.IsEmail(x => x.Email);
IsUrl
Pasa cuando el valor es una URL HTTP/HTTPS válida.
var rule = new ValiFlow<User>()
.IsUrl(x => x.Website);
IsGuid
Pasa cuando el valor es un string GUID válido (con o sin guiones).
var rule = new ValiFlow<Order>()
.IsGuid(x => x.ExternalId);
IsPhoneNumber
Pasa cuando el valor coincide con un patrón de número telefónico internacional o local.
var rule = new ValiFlow<User>()
.IsPhoneNumber(x => x.Phone);
IsJson
Pasa cuando el valor parece ser un objeto o array JSON válido (verificación estructural de patrón, sin parseo completo).
var rule = new ValiFlow<Order>()
.IsJson(x => x.Payload);
NotJson
Pasa cuando el valor no coincide con el patrón JSON.
var rule = new ValiFlow<Order>()
.NotJson(x => x.Value);
IsBase64
Pasa cuando el valor es un string codificado en Base64 válido.
var rule = new ValiFlow<User>()
.IsBase64(x => x.Token);
NotBase64
Pasa cuando el valor no es un string codificado en Base64 válido.
var rule = new ValiFlow<Order>()
.NotBase64(x => x.Value);
IsCreditCard
Pasa cuando el valor coincide con un patrón de número de tarjeta de crédito compatible con Luhn (dígitos, con espacios u guiones opcionales).
var rule = new ValiFlow<Order>()
.IsCreditCard(x => x.CardNumber);
IsIPv4
Pasa cuando el valor es una dirección IPv4 válida (p. ej. 192.168.1.1).
var rule = new ValiFlow<Order>()
.IsIPv4(x => x.IpAddress);
IsIPv6
Pasa cuando el valor es una dirección IPv6 válida.
var rule = new ValiFlow<Order>()
.IsIPv6(x => x.IpAddress);
IsHexColor
Pasa cuando el valor es un color hexadecimal CSS válido en formato #RGB o #RRGGBB.
var rule = new ValiFlow<Product>()
.IsHexColor(x => x.Color);
IsSlug
Pasa cuando el valor contiene únicamente letras minúsculas, dígitos y guiones (formato de slug para URLs).
var rule = new ValiFlow<Product>()
.IsSlug(x => x.UrlSlug);
Coincidencia de Patrones
RegexMatch
Pasa cuando el valor coincide con la expresión regular proporcionada.
var rule = new ValiFlow<Order>()
.RegexMatch(x => x.PostalCode, @"^\d{5}$");
MatchesWildcard
Pasa cuando el valor coincide con un patrón wildcard donde * representa cualquier secuencia de caracteres y ? representa exactamente un carácter.
var rule = new ValiFlow<Order>()
.MatchesWildcard(x => x.FileName, "report_*.pdf");
Nota: Solo en memoria — no traducible por EF Core.
IsOneOf
Pasa cuando el valor coincide exactamente con una de las entradas de la lista proporcionada. Un parámetro StringComparison opcional controla la distinción de mayúsculas (por defecto OrdinalIgnoreCase).
var rule = new ValiFlow<User>()
.IsOneOf(x => x.Status, ["active", "inactive", "pending"]);
// Con distinción de mayúsculas
var rule = new ValiFlow<User>()
.IsOneOf(x => x.Role, ["Admin", "Editor"], StringComparison.Ordinal);
Nota: Solo en memoria — no traducible por EF Core.
Ejemplo combinado
La siguiente regla valida una entidad User cubriendo los requisitos de string más comunes:
var rule = new ValiFlow<User>()
.IsNotNullOrWhiteSpace(x => x.Name)
.MinLength(x => x.Name, 2)
.MaxLength(x => x.Name, 100)
.IsEmail(x => x.Email)
.IsOneOf(x => x.Role, ["admin", "editor", "viewer"])
.MinLength(x => x.Password, 8)
.HasLettersAndNumbers(x => x.Password);
bool isValid = rule.Evaluate(user);
// O construir el árbol de expresiones para usar con LINQ
Expression<Func<User, bool>> expr = rule.Build();
var validUsers = dbContext.Users.Where(expr).ToList(); // solo métodos no en-memoria
Mini ejemplos
1) Email básico + dominio
var regla = new ValiFlow<User>()
.IsEmail(u => u.Email)
.EndsWith(u => u.Email, "@company.com");
2) Buscar en varios campos (en memoria)
var regla = new ValiFlow<Product>()
.Contains("wireless", x => x.Name, x => x.Description, x => x.Tags);