online - regular expression c#




È necessario eseguire la ricerca con caratteri jolly(*,?, Ecc.) Su una stringa utilizzando Regex (7)

Devo eseguire la ricerca con caratteri jolly ( * , ? , Ecc.) Su una stringa. Questo è quello che ho fatto:

string input = "Message";
string pattern = "d*";
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);

if (regex.IsMatch(input))
{
    MessageBox.Show("Found");
}
else
{
    MessageBox.Show("Not Found");
}

Con il codice sopra "Trovato" il blocco sta colpendo ma in realtà non dovrebbe!

Se il mio schema è "e *", allora solo "Trovato" dovrebbe colpire.

La mia comprensione o esigenza è d * search dovrebbe trovare il testo contenente "d" seguito da qualsiasi carattere.

Devo cambiare il mio schema come "d. *" E "e. *"? C'è qualche supporto in .NET per Wild Card che internamente lo fa mentre si usa la classe Regex?


È necessario evitare i simboli speciali Regex nel modello di caratteri jolly di input (ad esempio il modello *.txt equivale a ^.*\.txt$ *.txt ^.*\.txt$ ) Quindi le barre, le parentesi e molti simboli speciali devono essere sostituiti con @"\" + s , dove s - simbolo speciale Regex.


È possibile che si desideri utilizzare WildcardPattern dall'assembly System.Management.Automation . Vedi la mia risposta here .



Devi convertire la tua espressione jolly in un'espressione regolare. Per esempio:

    private bool WildcardMatch(String s, String wildcard, bool case_sensitive)
    {
        // Replace the * with an .* and the ? with a dot. Put ^ at the
        // beginning and a $ at the end
        String pattern = "^" + Regex.Escape(wildcard).Replace(@"\*", ".*").Replace(@"\?", ".") + "$";

        // Now, run the Regex as you already know
        Regex regex;
        if(case_sensitive)
            regex = new Regex(pattern);
        else
            regex = new Regex(pattern, RegexOptions.IgnoreCase);

        return(regex.IsMatch(s));
    } 

Penso che @Dmitri abbia una bella soluzione con le stringhe di corrispondenza con caratteri jolly https://.com/a/30300521/1726296

Sulla base della sua soluzione, ho creato due metodi di estensione. (il merito va a lui)

Può essere utile

public static String WildCardToRegular(this String value)
{
        return "^" + Regex.Escape(value).Replace("\\?", ".").Replace("\\*", ".*") + "$";
}

public static bool WildCardMatch(this String value,string pattern,bool ignoreCase = true)
{
        if (ignoreCase)
            return Regex.IsMatch(value, WildCardToRegular(pattern), RegexOptions.IgnoreCase);

        return Regex.IsMatch(value, WildCardToRegular(pattern));
}

Uso:

string pattern = "file.*";

var isMatched = "file.doc".WildCardMatch(pattern)

o

string xlsxFile = "file.xlsx"
var isMatched = xlsxFile.WildCardMatch(pattern)

Tutto il codice superiore non è corretto fino alla fine.

Questo perché durante la ricerca di zz * pippo * o zz * non si otterranno risultati corretti.

E se cerchi "abcd *" in "abcd" in TotalCommander troverà un file abcd in modo che tutto il codice superiore sia sbagliato.

Ecco il codice corretto.

public string WildcardToRegex(string pattern)
{             
    string result= Regex.Escape(pattern).
        Replace(@"\*", ".+?").
        Replace(@"\?", "."); 

    if (result.EndsWith(".+?"))
    {
        result = result.Remove(result.Length - 3, 3);
        result += ".*";
    }

    return result;
}

d* significa che deve corrispondere a zero o più caratteri " d ". Quindi ogni stringa è una corrispondenza valida. Prova invece d+ !

Per poter supportare i modelli jolly, sostituirei i caratteri jolly con gli equivalenti RegEx. Come * diventa .* E ? diventa .? . Quindi la tua espressione sopra diventa d.*





wildcard