Estoy buscando un patrón Regex de .NET que coincida con lo siguiente:
[.. (carácter de espacio, punto, punto, carácter de espacio)) *- los números decimales tienen un separador decimal, el . personaje
*- los números enteros o el valor entero de los números decimales deben tener un máximo de 4 dígitos
*- los números decimales deben tener un máximo de 4 dígitos fraccionarios
*- los números pueden ser negativos
*- si un número es positivo entonces falta el signo +
*- no importa cuál de los dos números sea menor (el primer número puede ser mayor que el segundo, "[56 .. 55)" por ejemplo)
El patrón debe coincidir con lo siguiente:
"[10 .. 15)" "[100 .. 15.2)" "[10.431 .. 15)" "[-10.3 .. -5)" "[-10.4 .. 5.12)" "[10.4312 .. -5.1232)"También me gustaría obtener los 2 números como cadenas de la cadena en caso de que el patrón coincida:
obtener "10" y "15" de "[10 .. 15)"
obtenga "-10.4" y "5.12" de "[-10.4 .. 5.12)"
Puedes usar
^\[(-?\d{1,4}(?:\.\d{1,4})?) \.\. (-?\d{1,4}(?:\.\d{1,4})?)\)$Vea la demostración de expresiones regulares . Detalles :
^ - comienzo de la cadena\[ - un [ carácter(-?\d{1,4}(?:\.\d{1,4})?) - Grupo 1: un - opcional, uno a cuatro dígitos y luego una secuencia opcional de un . y de uno a cuatro dígitos\.\. - una .. cadena(-?\d{1,4}(?:\.\d{1,4})?) - Grupo 2: un - opcional, uno a cuatro dígitos y luego una secuencia opcional de un . y de uno a cuatro dígitos\) - a ) carácter$ - final de la cadena (use \z si necesita verificar el final de la cadena).Vea la demostración de C# :
var texts = new List<string> { "[10 .. 15)", "[100 .. 15.2)", "[10.431 .. 15)", "[-10.3 .. -5)", "[-10.4 .. 5.12)", "[10.4312 .. -5.1232)", "[12345.1234 .. 0)", "[1.23456 .. 0" }; var pattern = new Regex(@"^\[(-?\d{1,4}(?:\.\d{1,4})?) \.\. (-?\d{1,4}(?:\.\d{1,4})?)\)$"); foreach (var s in texts) { Console.WriteLine($"---- {s} ----"); var match = pattern.Match(s); if (match.Success) { Console.WriteLine($"Group 1: {match.Groups[1].Value}, Group 2: {match.Groups[2].Value}"); } else { Console.WriteLine($"No match found in '{s}'."); } }Producción:
---- [10 .. 15) ---- Group 1: 10, Group 2: 15 ---- [100 .. 15.2) ---- Group 1: 100, Group 2: 15.2 ---- [10.431 .. 15) ---- Group 1: 10.431, Group 2: 15 ---- [-10.3 .. -5) ---- Group 1: -10.3, Group 2: -5 ---- [-10.4 .. 5.12) ---- Group 1: -10.4, Group 2: 5.12 ---- [10.4312 .. -5.1232) ---- Group 1: 10.4312, Group 2: -5.1232 ---- [12345.1234 .. 0) ---- No match found in '[12345.1234 .. 0)'. ---- [1.23456 .. 0 ---- No match found in '[1.23456 .. 0'.La siguiente expresión regular debería estar bien.
^\[-?\d+(?:\.\d+)? \.\. -?\d+(?:\.\d+)?\)$ var pattern = @"^\[-?\d+(?:\.\d+)? \.\. -?\d+(?:\.\d+)?\)$"; var inputs = new[]{"[10 .. 15)", "[100 .. 15.2)", "[10.431 .. 15)", "[-10.3 .. -5)", "[-10.4 .. 5.12)", "[10.4312 .. -5.1232)", }; foreach (var input in inputs) { Console.WriteLine(input + " = " + Regex.IsMatch(input, pattern)); } // [10 .. 15) = True // [100 .. 15.2) = True // [10.431 .. 15) = True // [-10.3 .. -5) = True // [-10.4 .. 5.12) = True // [10.4312 .. -5.1232) = TrueEsto funciona (ver este .Net Fiddle :
using System; using System.Text.RegularExpressions; public class Program { public static void Main() { Match m = rx.Match("[123 .. -9876.5432]"); if (!m.Success ) { Console.WriteLine("No Match"); } else { Console.WriteLine(@"left: {0}", m.Groups[ "left" ] ); Console.WriteLine(@"right: {0}", m.Groups[ "right" ] ); } } private static readonly Regex rx = new Regex(@" ^ # anchor match at start-of-text [[] # a left square bracket followed by (?<left> # a named capturing group, containing a number, consisting of -?[0-9]{1,4} # - a mandatory integer portion followed by ([.][0-9]{1,4})? # - an optional fractional portion ) # the whole of which is followed by [ ][.][.][ ] # a separator (' .. '), followed by (?<right> # another named capturing group containing a number, consisting of -?[0-9]{1,4} # - a mandatory integer portion followed by ([.][0-9]{1,4})? # - an optional fractional portion ) # the whole of which is followed by \] # a right square bracket, followed by $ # end-of-text ", RegexOptions.IgnorePatternWhitespace|RegexOptions.ExplicitCapture ); }