Laden...

Wildcard String matching => Regular Expression

Erstellt von rollerfreak2 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.128 Views
rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren
Wildcard String matching => Regular Expression

Hi zusammen,

ich habe folgendes Problem. Ich muss strings vergleichen aber mit Wildcards.

? einzelnes Zeichen
* mehere einzelne Zeichen

  • nummernbänder (12-15)

zu ?: Das kann in . konvertiert werden
zu : Das kann in . konvertiert werden

Am Anfang des Pattern noch ein "^" und am ende ein "$" hibzufügen.
Soweit so klar. Aber wie konvertiere ich nun wenn man nach "Bla_12-14" oder "1-200" sucht? Da streikt mein Kopf leider...

Again what learned...

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren

Ich habe zwar eine Lösung aber irgendwie gefällt die mir nicht. Ich lese den ausdruck 12-132 aus und parse minumum und maximum. Dann mach ich darauf den Regex [0-9]{minumum ,maximum}. Damm schau ich mich isMatch ob es Matched und im Falles es ist so ein Ausdruck enthalten, prüfe ich noch ob der Value innerhalb min und max ist.

Wenn einem was besseres einfällt immer her damit.

Again what learned...

795 Beiträge seit 2006
vor 13 Jahren

Lustig. Hatte gerade genau das selbe Thema. (EDIT: Bis auf das mit den Nummernbändern

Meine Lösung:

/// <summary>
/// Returns a regex for the specified format expression.
/// </summary>
/// <param name="format">
/// The format expression.
/// Format expression syntax:
///     * = Any number of chars (.*?)
///     ? = Any single character (.)
///     # = A single digit (\d)
///     % = A single character (\w)
///     Other input characters will be escaped using Regex.Escape(...).
/// </param>
/// <param name="formatDescriptor">The format descriptor for the format expression (e.g. "dd-mm-YYYY").</param>
/// <returns></returns>
public static Regex ToRegex(string format) {
    format = format.Replace("%", "%CHARACTER%").Replace("*", "%STAR%")
        .Replace("#", "%DIGIT%").Replace("?", "%QUESTIONMARK%");
    
    format = Regex.Escape(format);
    
    format = format.Replace("%STAR%", @".*?").Replace("%DIGIT%", @"\d")
        .Replace("%CHARACTER%", @"\w").Replace("%QUESTIONMARK%", @".");
    
    return new Regex(String.Format("^{0}$", format), RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
}

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
49.485 Beiträge seit 2005
vor 13 Jahren

Hallo rollerfreak2,

[0-9]{minumum ,maximum}

äh, sorry, das ist Quatsch. Denn innerhalb von {} wird ja die Anzahl der minimal erforderlichen bzw. maximal zulässigen Ziffern angegeben.

Ein Regex für einen Zahlenbereich zu bauen, ist nicht völlig trivial. Für den Bereich 452 - 786 wäre der Pattern z.B. 45[2-9]|4[6-9][0-9]|[5-6][0-9][0-9]|7[0-7][0-9]|78[0-6]. Aber ich denke, man kann trotzdem erkennen, wie man vorgehen muss.

Für deinen Konverter solltest du auch Regex.Escape verwenden.

Den fertigen Konverter kannst du gerne unter .NET-Komponenten und C#-Snippets veröffentlichen.

herbivore

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren

Ich schau mir das Schema mal an und werd das mal einbauen. Den Konverter stell ich dann bei den Snippet's mit rein.

Danke euch.

Again what learned...

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren

Ich hab mal was geschrieben und das unter den Snippets veröffentlicht. Ich hab ein paar Tests dazu geschrieben und die gehen alle durch. Hoffe mal ich hab nichts vergessen. Zu finden ist es hier.

Again what learned...