Estoy tratando de crear una clase para hacer coincidencias parciales usando expresiones regulares. Básicamente, estoy perdido en cuanto a cómo realizar la búsqueda.

La entrada vendrá como "harina # levadura # plátano" donde # representará una longitud desconocida, una colección desconocida de letras. La búsqueda debe mantener el orden de harina_ _ _ Levadura _ _ _Banana. Para que los partidos incluyan

"harina de plátano"

"flouraddyeastmashbanana"

"flouraddyeastbanana"

Pero no

"levaduraflourbanana"

El código de expresión regular que estoy pensando es @ "^ [a - zA - Z] + $"

Y lo que tengo hasta ahora es

static void Main(string[] args)
    {
        string[] input = "flour#yeast#banana".Split('*');
        string[] searchblock = new string[4] { "flouryeastbanana", "flouraddyeastmashbanana", "flouraddyeastbanana", "yeastflourbanana" };
        string pattern = @" ^[a - zA - Z] + $";


        foreach (string s in searchblock)
        {
            if (System.Text.RegularExpressions.Regex.IsMatch(s, pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
            {
                Console.WriteLine($"  (match for '{pattern}' found)");
            }
        }
        Console.ReadLine();
    }

Pero no puedo entender cómo seguir adelante con esto ni sé cómo hacer que busque más de 1/0 letras al azar ... así que estoy bastante seguro de que estoy equivocado

1
Cat 17 oct. 2019 a las 06:35

1 respuesta

La mejor respuesta

Simplemente reemplazaría '*' en su cadena de entrada (¿o es '#'? Su pregunta no está clara ... la narrativa dice una cosa, el código implica otra) con ".*?" y luego usa toda esa cuerda como patrón. P.ej.:

static void Main(string[] args)
{
    string input = "flour*yeast*banana";
    string[] searchblock = new string[4] { "flouryeastbanana", "flouraddyeastmashbanana", "flouraddyeastbanana", "yeastflourbanana" };
    string pattern = input.Replace("*", ".*?");

    foreach (string s in searchblock)
    {
        if (System.Text.RegularExpressions.Regex.IsMatch(s, pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
        {
            Console.WriteLine($"input \"{s}\":  (match for '{pattern}' found)");
        }
    }
}

La secuencia ".*?" en la expresión regular dice que coincida con cualquier número de cualquier carácter, con el menor número posible de caracteres que aún permitirán que la coincidencia sea exitosa. Al usarlo en lugar de su marcador en la cadena de entrada, eso permite que coincida cualquier cadena con sus cadenas que no son marcadores separadas por cualquier otro carácter.

Tenga en cuenta que el ? en la cadena probablemente sea opcional en su caso. Haría una diferencia sutil con respecto a dónde ocurrieron las coincidencias si presentara el patrón con cadenas que incluyan las cadenas sin marcador varias veces, pero no debería afectar si las cadenas realmente coincidieron o no. Entonces, si lo prefiere, probablemente podría usar ".*" como texto de reemplazo en lugar de ".*?".

2
Peter Duniho 17 oct. 2019 a las 03:53