C# Sonderzeichen Ignorieren?
Hallo,
momentan verwende ich sowas:
if (!ExcludedWordsArray.Contains(folderName, StringComparer.OrdinalIgnoreCase) && !folderIsHidden.Attributes.HasFlag(FileAttributes.Hidden))
ExcludedWordsArray ist ein Array mit Strings, wie "Windows", "alt" etc.
Soweit funktioniert es echt gut.
Wenn ich nun aber ein Ordner habe der "alt Dateien" heißt wird er auch rausgefiltert.
Hab ich nun ein Ordner der "alt.Dateien" heißt wird er nicht Rausgefiltert.
Jemand eine Idee wie ich Punkt (.) Ignorieren kann ohne dabei den String zu Schneiden ?
4 Antworten
Du willst also überprüfen, ob irgendwo in dem String einer der Strings in der "Du nicht!"-Liste vorkommt?
Oder muss der String durch ein nicht-Wort-Zeichen vom Rest getrennt sein?
Also soll z.B. wenn nach "alt" gesucht wird nur so was wie "alt.irgendwas" oder auch "alternative" als übereinstimmung zählen?
Nur keine Sorge. Ich hab zwar durchaus n bisschen geregext, aber mindestens genauso viel gelinqt. ^^
OMG, du outest dich gerade als C#ler. Bei deinem Talent könntest du aber bestimmt auch ein richtiger Programmierer werden.
OMG, du outest dich gerade als C#ler.
Naja, C# ist mein Lieblingsprodukt von Microsoft. (Gut, das sagt nicht unbedingt viel über C# aus, da es so ziemlich das einzige von Microsoft fabrizierte ist, das ich ganz gerne benutze. Und dann auch meistens unter Verwendung von Mono auf nem Linux-System, aber ich benutze es. ^^)
Aber ich bastel auch ganz gerne mit C, Java und Python, gelegentlich auch mit PHP.
Bei deinem Talent könntest du aber bestimmt auch ein richtiger Programmierer werden.
Ouuu, da hoffe ich doch mal, du meinst "berufsmäßiger Programmierer". ^^
"alt.Irgendwas" => Filtern.
"Alternativ" => Nicht filtern.
Sowas meine ich. ^^
Na dann:
Schritt 1: Die benötigten using-Direktiven hinzufügen:
using System;
using System.Text.RegularExpressions;
using System.Linq;
Schritt 2: An entsprechender Stelle die Abfrage entsprechend ändern:
bool IsExcluded = ExcludedWordsArray.Select(word => Regex.Matches(folderName, "(?:^|[^\\w])(\\w+)", RegexOptions.IgnoreCase).Cast<Match>().Select(match => match.Groups[1].Value).Contains(word, StringComparer.OrdinalIgnoreCase)).Contains(true);
Die bool-Variable IsExcluded kann dann verwendet werden um zu überprüfen, ob folderName ein Wort aus ExcludedWordsArray enthält (true) oder nicht (false).
Erstmal:
Diese Abfrage sieht ziemlich Verrückt und verrwirrend aus, aber Regex verwirrt mich im Allgemein noch etwas :D
Hab es ausprobiert funktioniert soweit, nur der lässt auch string durch die "so_alt" heißen, obwohl ich "SO" ausgefiltert habe.
Ne Idee warum ?
Ne Idee warum ?
Weil aus irgendeinem Grund der Unterstrich in C#-RegExes als Wortzeichen behandelt wird... o.O
Aber so funktionierts:
bool IsExcluded = ExcludedWordsArray
.Select(word =>
Regex.Matches(folderName, "(?:^|[\\W_])([^^\\W_]+)(?:$|[\\W_])", RegexOptions.IgnoreCase)
.Cast<Match>()
.Select(match => match.Groups[1].Value)
.Contains(word, StringComparer.OrdinalIgnoreCase)
)
.Contains(true);
Diese Abfrage sieht ziemlich Verrückt und verrwirrend aus
Ohhh Jahhh, das tut sie in der Tat. das ganze ist zwar relativ einfach, wenn mans mal verstanden hat, aber bis mans denn mal verstanden hat liest es sich erstmal wie Altaramäisch von einem betrunkenen Sumerer in ägyptischen Hieroglyphen dahingekritzeltes. ^^
Deine Ausdrucksweise gefällt mir :D
Es funktioniert, vielen Dank 1+.
Das Sternchen hast du dir aufjedenfall Verdient :D
Für so etwas verwendet man reguläre Ausdrücke. Du wählst dabei ein Muster, welches alle validen beziehungsweise invaliden Namen abdeckt. Du kannst deine Zeichenkette, beispielsweise der Name des Ordners, auf dieses Muster prüfen. Reguläre Ausdrücke sind dabei allerdings nicht die einfachste Kost, was das lernen angeht, ich empfehle dir, dir dafür Zeit zu nehmen und beispielsweise Hilfen wie RegExr zu verwenden.
Vielen Dank .
hatte nun echt viele Fälle wo Regex am geeignetsten gewesen ist.
Genauso hier.
Das werde ich definitiv lernen...
Wie gesagt, nimm dir Zeit dafür, es ist nichts, was man mal einfach so in paar Minuten lernt, sei es das Erstellen von RegEx Mustern oder das Benutzen dieser und der Ergebnisse im Code selbst.
Ich würde einen anderen Ansatz wählen:
Statt zu prüfen,
ob der Ordnername im Array enthalten ist,
wäre es doch genauer,
für jeden Ordnernamen das Array zu durchlaufen und zu prüfen, ob ein Wert des Arrays im String des Ordnernamen enthalten ist.
Pseudocode:
if(isFolderNameExcluded(folderName) ...
Methode:
boolean isFolderNameExcluded(String name){
*Schleife durch Array*
if(name contains curValue) -> return true;
return false;
}
Ich verstehe nicht ganz, was Du vorhast, aber wenn Du nur ein paar Sonderzeichen ignorieren willst, warum entfernst oder ersetzt Du sie nicht einfach durch etwas, das besser passt?
Hee, wenn Du so weiter machst, ist Nutzer regex bald arbeitslos!