Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wildcard String matching => Regular Expression
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 916

Themenstarter:

Wildcard String matching => Regular Expression

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 916

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
TheBrainiac
myCSharp.de - Member

Avatar #avatar-3152.png


Dabei seit:
Beiträge: 795
Herkunft: /dev/null

beantworten | zitieren | melden

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"
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo rollerfreak2,
Zitat
[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
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 916

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 916

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers